This is a migrated thread and some comments may be shown as answers.

Setting predefined values inside user control on item insertion on Page Load

9 Answers 252 Views
Grid
This is a migrated thread and some comments may be shown as answers.
pylacroix
Top achievements
Rank 1
pylacroix asked on 09 Nov 2010, 02:42 PM
Hi,

Based on the section Setting predefined values for controls inside user control on item insertion, how can I set predefined values inside a user control on item insertion at the Page Load when we set IsItemInserted = true in the PreRender Event ?

Here is the code I have

protected void RadGrid_PreRender(object sender, System.EventArgs e)
    {
        if (!this.IsPostBack)
        {
            if (Request["mode"] != null && Request["mode"] == "add")
            {
                RadGrid1.MasterTableView.IsItemInserted = true;
            }
 
            RadGrid1.MasterTableView.Rebind();
        }
    }


protected void RadGrid_ItemCommand(object source, GridCommandEventArgs e)
{
    if (e.CommandName == RadGrid.InitInsertCommandName)
    {
         if (Request.QueryString["SomeParameter"] != null)
        {
            e.Canceled = true;
            e.Item.OwnerTableView.InsertItem();
 
            GridEditableItem insertedItem = e.Item.OwnerTableView.GetInsertItem();
            String MyUserControlId = GridEditFormItem.EditFormUserControlID;
            UserControl MyUserControl = insertedItem.FindControl(MyUserControlId) as UserControl;
            HiddenField hidden = MyUserControl.FindControl("SomeControl") as HiddenField;
            hidden.Value = Request.QueryString["SomeParameter"];
        }
    }
}

Also, it works fines if I don't add IsItemInserted = true in the PreRender event



Thanks

9 Answers, 1 is accepted

Sort by
0
Veli
Telerik team
answered on 11 Nov 2010, 03:16 PM
Hi pylacroix,

In Page_Load your insert form may not be initialized yet. The earliest point when you have the insert form available is RadGrid's ItemCreated event:

protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
{
    if (e.Item is GridEditFormInsertItem && e.Item.IsInEditMode)
    {
        GridEditFormInsertItem insertedItem = (GridEditFormInsertItem)e.Item;
        String MyUserControlId = GridEditFormItem.EditFormUserControlID;
        UserControl MyUserControl = insertedItem.FindControl(MyUserControlId) as UserControl;
        HiddenField hidden = MyUserControl.FindControl("SomeControl") as HiddenField;
        hidden.Value = Request.QueryString["SomeParameter"];
    }
}

In the above code sample we are accessing the user control in the insert form just when it is initialized.

Veli
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
pylacroix
Top achievements
Rank 1
answered on 11 Nov 2010, 05:08 PM
Thanks Veli,

Do I have to cancel the event just as in the RagGrid1_ItemCommand event ?

With the code you provided, I am able to assign the value to my Hidden control on the Page_Load, but once the user control loads, the control has an empty value.

I managed to make it work using the Context

Context.Items["ContextVar"] = Request.QueryString["SomeParameter"];

and in my user control

if (Context.Items["ContextVar"] != null)
{
    // do something with my value
}

Is there a better and proper way to do it?

Thanks
0
Veli
Telerik team
answered on 11 Nov 2010, 06:15 PM
Hi pylacroix,

Can you show us some sample code, so that we can try to understand better what's going on?

Greetings,
Veli
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
pylacroix
Top achievements
Rank 1
answered on 11 Nov 2010, 08:14 PM
as requested here are the files and this occurs on Telerik version 2010.1.519.35. you will notice the Context is used in the RadgridAddOnLoad.aspx.cs

Context.Items["manufID"] = Request.QueryString["intManufacturerId"];

and in ucManufacturerAccountEdit.ascx.cs

if (Context.Items["manufID"] != null)
{
    txtManufacturer.SelectedValue = Context.Items["manufID"].ToString();
}

so basically, if I remove those instructions, the manufacturer combobox is not predefined with the valued specified by the value of the querystring (ie: RadgridAddOnLoad.aspx?mode=add&intManufacturerId=5). If I leave those instructions then the combobox is predefined.


the files

Data.xml
<root>
    <entry ID="1" BusinessID="1" BusinessName="Business1" ManufacturerID="1" ManufacturerName="Manufacturer1" Description="Description1" Account="" PIN="PIN1"  />
    <entry ID="2" BusinessID="2" BusinessName="Business2" ManufacturerID="2" ManufacturerName="Manufacturer2" Description="Description2" Account="" PIN="PIN2"  />
    <entry ID="3" BusinessID="3" BusinessName="Business3" ManufacturerID="3" ManufacturerName="Manufacturer3" Description="Description3" Account="" PIN="PIN3"  />
    <entry ID="4" BusinessID="4" BusinessName="Business4" ManufacturerID="4" ManufacturerName="Manufacturer4" Description="Description4" Account="" PIN="PIN4"  />
</root>

RadgridAddOnLoad.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="RadgridAddOnLoad.aspx.cs" Inherits="test_RadgridAddOnLoad" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <telerik:RadScriptManager ID="RadScriptManager1" runat="server" />
    <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" />
                         
 
    <telerik:RadAjaxManagerProxy ID="RadAjaxManagerProxy1" runat="server">
        <AjaxSettings>
            <telerik:AjaxSetting AjaxControlID="RadAjaxManagerProxy1">
                <UpdatedControls>
                    <telerik:AjaxUpdatedControl ControlID="grdStore" LoadingPanelID="RadAjaxLoadingPanel1" />
                </UpdatedControls>
            </telerik:AjaxSetting>
            <telerik:AjaxSetting AjaxControlID="grdStore">
                <UpdatedControls>
                    <telerik:AjaxUpdatedControl ControlID="grdStore" LoadingPanelID="RadAjaxLoadingPanel1" />
                </UpdatedControls>
            </telerik:AjaxSetting>
        </AjaxSettings>
    </telerik:RadAjaxManagerProxy
     
    <telerik:RadAjaxLoadingPanel runat="server" ID="RadAjaxLoadingPanel1" Height="150px" Width="150px" />
     
    <telerik:RadScriptBlock ID="RadScriptBlock1" runat="server">
    <script type="text/javascript">
        function PopUpShowing(sender, eventArgs) {
            var popUp = eventArgs.get_popUp();
            var scrollTop = (typeof window.innerHeight != 'undefined' ? 0 : document.documentElement.scrollTop);
            var popUpWidth = popUp.style.width.substr(0, popUp.style.width.indexOf("px"));
            var popUpHeight = popUp.style.height.substr(0, popUp.style.height.indexOf("px"));
            var windowHeight = (typeof window.innerHeight != 'undefined' ? window.innerHeight : document.body.offsetHeight - scrollTop);
            var windowWidth = document.body.offsetWidth;
            if (popUpHeight == "") popUpHeight = 300; // if the height isn't set on the popup, default to 300px
            popUp.style.position = "fixed";
            popUp.style.left = (Math.floor((windowWidth - popUpWidth) / 2)).toString() + "px";
            popUp.style.top = (Math.floor((windowHeight - popUpHeight) / 2) + scrollTop).toString() + "px";
        }
 
    </script>
    </telerik:RadScriptBlock>
     
    <asp:HiddenField ID="txtDealerGUID" runat="server" />
    <asp:HiddenField ID="txtAdministrationURL" runat="server" />
 
    <telerik:RadGrid ID="grdStore" runat="server"
        GridLines="None"
        AllowPaging="True"
        AllowSorting="True"
        AllowFilteringByColumn="true"
        Width="100%"
        AutoGenerateColumns="False"
        OnPreRender="grdStore_PreRender"
        DataSourceID="XmlDataSource1"
        OnDeleteCommand="grdStore_DeleteCommand"
        OnItemDataBound="grdStore_ItemDataBound"
        OnUpdateCommand="grdStore_UpdateCommand"
        OnInsertCommand="grdStore_InsertCommand"
        OnItemCommand="grdStore_ItemCommand"
        OnItemCreated="grdStore_ItemCreated"
        AllowMultiRowEdit="False"
        AllowMultiRowSelection="False">
        <ClientSettings>
            <ClientEvents OnPopUpShowing="PopUpShowing" />
        </ClientSettings>
        <MasterTableView GridLines="None" Width="100%" DataKeyNames="ID" NoMasterRecordsText="<%$ Resources:Resource, lblNoRecordToDisplay%>" CommandItemDisplay="Top" CommandItemSettings-AddNewRecordText="Add" EditFormSettings-PopUpSettings-Modal="true" EditFormSettings-PopUpSettings-Height="200px" EditFormSettings-PopUpSettings-Width="730px" EditFormSettings-PopUpSettings-ZIndex="2999" EditMode="PopUp">
            <rowindicatorcolumn visible="False">
                <HeaderStyle Width="20px" />
            </rowindicatorcolumn>
            <expandcollapsecolumn resizable="False" visible="False">
                <HeaderStyle Width="20px" />
            </expandcollapsecolumn>
            <CommandItemSettings RefreshImageUrl="Refresh.gif" />
            <Columns>
                <telerik:GridBoundColumn SortExpression="BusinessName" HeaderText="<% $ Resources:Resource, lblStore %>" DataField="BusinessName" UniqueName="BusinessName" />
                <telerik:GridBoundColumn SortExpression="ManufacturerName"  HeaderText="<% $ Resources:Resource, lblManufacturer %>" DataField="ManufacturerName" UniqueName="ManufacturerName" />
                <telerik:GridBoundColumn SortExpression="Description" HeaderText="<% $ Resources:Resource, lblDescription %>" DataField="Description" UniqueName="Description" />
                <telerik:GridBoundColumn SortExpression="PIN" HeaderText="<% $ Resources:Resource, lblPIN %>" DataField="PIN" UniqueName="PIN" />
                <telerik:GridTemplateColumn AllowFiltering="false" UniqueName="Status" HeaderText="<% $ Resources:Resource, lblStatus %>">
                    <ItemTemplate>
                        <asp:Label ID="lblStatus" runat="server" />
                    </ItemTemplate>
                </telerik:GridTemplateColumn>
                <telerik:GridEditCommandColumn UpdateText="Update" UniqueName="EditCommandColumn" CancelText="Cancel" EditText="<% $ Resources:Resource, lblEdit %>" />
                <telerik:GridButtonColumn ConfirmText="<% $ Resources:Resource, lblDeleteConfirmation %>" UniqueName="DeleteColumn" Text="<%$ Resources:Resource, lblDelete%>" CommandName="Delete" />
            </Columns>
            <EditFormSettings UserControlName="~/Controls/ucManufacturerAccountEdit.ascx" EditFormType="WebUserControl" CaptionFormatString="<%$ Resources:Resource, lblAccounts%>" />
            <PagerStyle Mode="NextPrev" />
        </MasterTableView>
    </telerik:RadGrid>
<asp:XmlDataSource ID="XmlDataSource1" runat="server"
 DataFile="~/test/data.xml" >
</asp:XmlDataSource>
     
    </div>
    </form>
</body>
</html>

RadgridAddOnLoad.aspx.cs
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Tech2020.Business.BusinessLogicLayer;
using Telerik.Web.UI;
using System.Collections.Generic;
using System.Xml;
 
public partial class test_RadgridAddOnLoad : System.Web.UI.Page
{
    #region " Events "
    protected void Page_Load(object sender, EventArgs e)
    {
    }
 
    protected void Page_PreInit(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        }
    }
 
    protected void grdStore_PreRender(object sender, System.EventArgs e)
    {
        if (!this.IsPostBack)
        {
            if (Request["mode"] != null && Request["mode"] == "add")
            {
                grdStore.MasterTableView.IsItemInserted = true;
            }
 
            grdStore.MasterTableView.Rebind();
        }
    }
 
    protected void grdStore_ItemCommand(object source, GridCommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case RadGrid.EditCommandName:
                grdStore.MasterTableView.IsItemInserted = false;
                break;
            case RadGrid.InitInsertCommandName:
                grdStore.MasterTableView.ClearEditItems();
                 
                if (Request.QueryString["intManufacturerId"] != null)
                {
                    e.Canceled = true;
                    e.Item.OwnerTableView.InsertItem();
 
                    var insertedItem    = e.Item.OwnerTableView.GetInsertItem();
                    var control         = insertedItem.FindControl(GridEditFormItem.EditFormUserControlID) as UserControl;
 
                    ((HiddenField)control.FindControl("ManufacturerID")).Value = Request.QueryString["intManufacturerId"];
                }
 
                break;
        }
    }
 
    protected void grdStore_ItemDataBound(object sender, GridItemEventArgs e)
    {
        if (e.Item is GridCommandItem)
        {
            GridCommandItem item = (GridCommandItem)e.Item;
 
            //hide refresh linkbutton
            ((LinkButton)item.FindControl("RebindGridButton")).Visible  = false;
        }
    }
 
    protected void grdStore_UpdateCommand(object source, GridCommandEventArgs e)
    {
        if (e.Item is GridEditableItem)
        {
           // update record
        }
    }
 
    protected void grdStore_InsertCommand(object source, GridCommandEventArgs e)
    {
        if (e.Item is GridEditableItem)
        {
            // add record
        }
    }
 
    protected void grdStore_DeleteCommand(object source, GridCommandEventArgs e)
    {
        // delete record
    }
 
    protected void grdStore_ItemCreated(object sender, GridItemEventArgs e)
    {
        if (e.Item is GridEditFormInsertItem && e.Item.IsInEditMode)
        {
            if (Request.QueryString["intManufacturerId"] != null)
            {
                var insertedItem    = (GridEditFormInsertItem)e.Item;
                var control         = insertedItem.FindControl(GridEditFormItem.EditFormUserControlID) as UserControl;
 
                ((HiddenField)control.FindControl("ManufacturerID")).Value = Request.QueryString["intManufacturerId"];
                Context.Items["manufID"] = Request.QueryString["intManufacturerId"];
                 
            }
        }
    }
    #endregion
}

ucManufacturerAccountEdit.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucManufacturerAccountEdit.ascx.cs" Inherits="Controls_ucManufacturerAccountEdit" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
 
<asp:HiddenField ID="ManufacturerID" runat="server" Value='<%# DataBinder.Eval( Container, "DataItem.ManufacturerID" ) %>' />
 
<div style="padding:8px">
        <table class="gridUcSingleEdit">
        <tr>
            <td class="label"><asp:Label Text="<% $ Resources:Resource, lblStore %>" runat="server" /></td>
            <td><telerik:RadComboBox ID="txtBusiness" runat="server" Width="268px" /></td>
            <td class="label"><asp:Label Text="<% $ Resources:Resource, lblManufacturer %>" runat="server" /></td>
            <td><telerik:RadComboBox ID="txtManufacturer" runat="server" Width="268px" /></td>
        </tr>
        <tr>
            <td class="label"><asp:Label ID="lblAccount" Text="<% $ Resources:Resource, lblAccount %>" runat="server" /></td>
            <td><asp:TextBox ID="txtAccount" Text='<%# DataBinder.Eval( Container, "DataItem.Account" ) %>' MaxLength="255" runat="server" Width="264px" /><asp:TextBox ID="txtPIN" Enabled="false" Visible="false" Text='<%# DataBinder.Eval( Container, "DataItem.PIN" ) %>' MaxLength="255" runat="server" Width="264px" /><asp:RequiredFieldValidator Display="Dynamic" ErrorMessage="<%$ Resources:Resource, lblRequired%>" ControlToValidate="txtAccount" runat="server" /></td>
            <td class="label"><asp:Label Text="<% $ Resources:Resource, lblDescription %>" runat="server" /></td>
            <td><asp:TextBox ID="txtDescription" TextMode="MultiLine" Text='<%# DataBinder.Eval( Container, "DataItem.Description" ) %>' MaxLength="255" Width="264px" runat="server" /><asp:RequiredFieldValidator Display="Dynamic" ErrorMessage="<%$ Resources:Resource, lblRequired%>" ControlToValidate="txtDescription" runat="server" /></td>
        </tr>
        <tr>
            <td colspan="2" style="padding-left:2px;"><asp:Label CssClass="txtRefused" Text="<% $ Resources:Resource, lblAllFieldsRequired %>" runat="server" /></td>
            <td colspan="2" align="right" style="padding-right:14px;">
                <asp:button id="btnUpdate" text="Update" runat="server" CssClass="button" CommandName="Update" Visible='<%# !(DataItem is Telerik.Web.UI.GridInsertionObject) %>'></asp:button>
                <asp:button id="btnInsert" text="Insert" runat="server" CssClass="button" CommandName="PerformInsert" Visible='<%# DataItem is Telerik.Web.UI.GridInsertionObject %>'></asp:button>
                  
                <asp:button id="btnCancel" text="Cancel" runat="server" CssClass="button" causesvalidation="False" commandname="Cancel"></asp:button>
            </td>
        </tr>
    </table>
</div>

ucManufacturerAccountEdit.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
 
using Tech2020.Business.BusinessLogicLayer;
 
public partial class Controls_ucManufacturerAccountEdit : System.Web.UI.UserControl
{
    private Tech2020.Business.BusinessLogicLayer.Manufacturer   _manufacturerBLL    = new Manufacturer();
    private Common                                              _common             = new Common();
    private Tech2020.Business.BusinessLogicLayer.Business       _businessBll        = new Tech2020.Business.BusinessLogicLayer.Business();
 
    public object DataItem { get; set; }
 
    protected void Page_PreRender(object sender, EventArgs e)
    {
        txtManufacturer.DataSource      = _manufacturerBLL.Get();
        txtManufacturer.DataTextField   = "Name";
        txtManufacturer.DataValueField  = "ID";
        txtManufacturer.DataBind();
 
        txtManufacturer.SelectedValue   = (ManufacturerID.Value != "" ? ManufacturerID.Value : txtManufacturer.Items[0].Value);
 
        if (Context.Items["manufID"] != null)
        {
            txtManufacturer.SelectedValue = Context.Items["manufID"].ToString();
        }
 
        txtBusiness.DataSource = _businessBll.GetDealerStores(Convert.ToInt32(Session["DealerID"]), Convert.ToInt32(Tech2020.Generic.Const.Const.Attribute.Business_Sale_Lead_Email), 0, 0, Convert.ToInt32(Session["LanguageID"]));
        txtBusiness.DataTextField = "Name";
        txtBusiness.DataValueField = "ID";
        txtBusiness.DataBind();
         
    }
}


0
Veli
Telerik team
answered on 12 Nov 2010, 02:36 PM
Hi pylacroix,

To reproduce this issue, I put your source code in a sample project and was able to run it. I removed the localization strings, and bound RadComboBox in the insert form to simple array of integer values. I also appended the query string ?intManufacturerId=7 to the URL to test how this value will be set to the combo. The result I am getting is that this seems to work without the help of the Context object. The way you have implemented it, the query string value will be set to the ManufacturerID hidden field right in ItemCommand event handler where you generate a new insert item and find the hidden field in it. (to check that, I have turned the hidden field to a TextBox control to see its value). Attaching the test page, user control and XML file I am using. Seems to work without the Context object too.

Veli
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
pylacroix
Top achievements
Rank 1
answered on 12 Nov 2010, 03:52 PM
Hi Veli,

I took the code from the file testpage.zip, I created a new project, I added a reference to Telerik 2010.1.519, added

<add path="Telerik.Web.UI.WebResource.axd" verb="*" type="Telerik.Web.UI.WebResource, Telerik.Web.UI, Version=2010.1.519, Culture=neutral, PublicKeyToken=121fae78165ba3d4" validate="false"/>


to the web.config and when I load the following page http://localhost:49226/test/RadgridAddOnLoad.aspx?mode=add&intManufacturerID=3 manufacturer 3 is not selected and the text field you added is empty either on IE or Firefox.

0
Accepted
Veli
Telerik team
answered on 17 Nov 2010, 01:40 PM
Hello pylacroix,

Yes, it seems when you add mode=add to the query string parameters the value is not set to the combo. But this is because when you have mode=add, you do not fire the ItemCommand event for InitInsert (showing the insert form). This is the code that gets run:

protected void grdStore_PreRender(object sender, System.EventArgs e)
{
    if (!this.IsPostBack)
    {
        if (Request["mode"] != null && Request["mode"] == "add")
        {
            grdStore.MasterTableView.IsItemInserted = true;
        }
 
        grdStore.MasterTableView.Rebind();
    }
}

Note that in the above code sample I only set the master table to be in insert mode and rebind the grid. No command is actually fired on this action. But what I need is the InitInsert command to fire, so that I can use the ItemCommand event handler to use that:

protected void grdStore_ItemCommand(object source, GridCommandEventArgs e)
{
    switch (e.CommandName)
    {
        case RadGrid.EditCommandName:
            grdStore.MasterTableView.IsItemInserted = false;
            break;
        case RadGrid.InitInsertCommandName:
            grdStore.MasterTableView.ClearEditItems();
 
            if (Request.QueryString["intManufacturerId"] != null)
            {
                e.Canceled = true;
                e.Item.OwnerTableView.InsertItem();
 
                var insertedItem = e.Item.OwnerTableView.GetInsertItem();
                var control = insertedItem.FindControl(GridEditFormItem.EditFormUserControlID) as UserControl;
 
                ((TextBox)control.FindControl("ManufacturerID")).Text = Request.QueryString["intManufacturerId"];
            }
 
            break;
    }
}

So, what I need to do when checking for the mode=add query string is to fire the InitInsert command instead:

protected void grdStore_PreRender(object sender, System.EventArgs e)
{
    if (!this.IsPostBack)
    {
        if (Request["mode"] != null && Request["mode"] == "add")
        {
            grdStore.MasterTableView.GetItems(GridItemType.CommandItem)[0].FireCommandEvent(RadGrid.InitInsertCommandName, String.Empty);
        }
    }
}

Using the above code in PreRender now successfully fires the ItemCommand event handler in RadGrid, where we get the manufacturer ID and assign it to the textbox in the user control.

Veli
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
pylacroix
Top achievements
Rank 1
answered on 17 Nov 2010, 01:55 PM
Thanks Veli it works fine now
0
Kiranmayee
Top achievements
Rank 1
answered on 15 Sep 2018, 02:36 AM

Hi,

 

I tried the Item Command syntax. It worked when I was using it in the master table but it does not work when trying to do the same in detail table. Says Object not set to reference. Please help.

Tags
Grid
Asked by
pylacroix
Top achievements
Rank 1
Answers by
Veli
Telerik team
pylacroix
Top achievements
Rank 1
Kiranmayee
Top achievements
Rank 1
Share this question
or