Question

I use RadGrid EditForm with UserControl like this sample Telerik Sample

<telerik:RadGrid ID="personGrid" runat="server" AutoGenerateColumns="False" OnEditCommand="personGrid_EditCommand" OnUpdateCommand="personGrid_UpdateCommand">
        <MasterTableView DataKeyNames="ID" CommandItemDisplay="Top">
            <EditFormSettings UserControlName="PersonItemsUC.ascx" EditFormType="WebUserControl">
            </EditFormSettings>
            <Columns>
                <telerik:GridBoundColumn UniqueName="ID" Display="false" HeaderText="ID" DataField="ID">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn UniqueName="Name" HeaderText="Name" DataField="Name">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn UniqueName="Family" HeaderText="Family" DataField="Family">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn UniqueName="Age" HeaderText="Age" DataField="Age">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn UniqueName="MobileNo" HeaderText="MobileNo" DataField="MobileNo">
                </telerik:GridBoundColumn>
                <telerik:GridEditCommandColumn EditText="Update" UniqueName="EditCommandColumn">
                </telerik:GridEditCommandColumn>
                <telerik:GridButtonColumn UniqueName="DeleteColumn" Text="Delete" CommandName="Delete">
                </telerik:GridButtonColumn>
            </Columns>
        </MasterTableView>
</telerik:RadGrid>

and I have UserControl like this (have Person Info data) enter image description here

I have method in My Usercontrol (GetDataFromControls)

        public Person GetDataFromControls()
    {
        var sKey = typeof(Person).FullName + "Keys";
        var p = new Person();
        p.ID = Convert.ToInt32(SessionManager.Instance[sKey]); // ID store in Session with personGrid_EditCommand method
        p.Name = txtName.Text;
        p.Family = txtFamily.Text;
        p.Age = Convert.ToInt32(txtAge.Text);
        p.MobileNo = txtMobileNo.Text;
        return p;
    }

can get data from textboxes and other controls and set to Person instanse OK now I want to update data so use this method in my page.aspx

protected void personGrid_UpdateCommand(object sender, GridCommandEventArgs e)
{
    var userControl = e.Item.FindControl(GridEditFormItem.EditFormUserControlID) as PersonItemsUC;
    if (userControl != null)
    {
        var p = userControl.GetDataFromControls(); //HERE
        _personBusiness.Update(p);
    }
}

first I found my usercontrol in UpdateCommand method and then call GetDataFromControls method but except ID that get from Session other data lost !!! all textboxes is empty

How can i call GetDataFromControls() method with valid data ?

Another solution that came to my mind saving GetDataFromControls to Session by this property

    public Person CurrentEntity
    {
        get
        {
            var key = typeof(Person).FullName;
            return SessionManager.Instance[key] as Person;
        }
        set
        {
            var key = typeof(Person).FullName;
            SessionManager.Instance.Add(key, value);
        }
    }

and then call CurrentEntity instead of GetDataFromControls()

    protected void personGrid_UpdateCommand(object sender, GridCommandEventArgs e)
    {
        var userControl = e.Item.FindControl(GridEditFormItem.EditFormUserControlID) as PersonItemsUC;
        if (userControl != null)
        {
            var p = userControl.CurrentEntity; //HERE
            _personBusiness.Update(p);
        }
    }

but I dont know when fill CurrentEntity in which event into my UserControl ?

CurrentEntity = GetDataFromControls(); // When assign method to CurrentEntity in My UserControl ???

Can anyone suggest good solution for calling GetDataFromControls from UserControl in Page.aspx without lost data ???

Was it helpful?

Solution

Please try with the below code snippet.

ASPX

<body>
    <form id="form1" runat="server">
        <div>
            <telerik:RadScriptManager ID="RadScriptManager1" EnablePageMethods="true" runat="server">
            </telerik:RadScriptManager>
            <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
            </telerik:RadAjaxManager>
            <telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="false" OnNeedDataSource="RadGrid1_NeedDataSource"
                AllowMultiRowEdit="true" OnUpdateCommand="RadGrid1_UpdateCommand">
                <PagerStyle AlwaysVisible="true" />
                <MasterTableView DataKeyNames="ID" CommandItemDisplay="Top">
                    <Columns>
                        <telerik:GridBoundColumn DataField="ID" UniqueName="ID" HeaderText="ID">
                        </telerik:GridBoundColumn>
                        <telerik:GridBoundColumn DataField="Name" UniqueName="Name" HeaderText="Name">
                        </telerik:GridBoundColumn>
                        <telerik:GridEditCommandColumn></telerik:GridEditCommandColumn>
                    </Columns>
                    <EditFormSettings UserControlName="WebUserControl1.ascx" EditFormType="WebUserControl">
                        <EditColumn UniqueName="EditCommandColumn1">
                        </EditColumn>
                    </EditFormSettings>
                </MasterTableView>
            </telerik:RadGrid>
        </div>
    </form>
</body>

ASPX.CS

public partial class Forum : System.Web.UI.Page
{

    protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
        List<Employee> list = new List<Employee>();
        list.Add(new Employee() { ID = 1, Name = "Name1" });
        list.Add(new Employee() { ID = 2, Name = "Name2" });
        list.Add(new Employee() { ID = 3, Name = "Name3" });
        list.Add(new Employee() { ID = 4, Name = "Name4" });
        list.Add(new Employee() { ID = 5, Name = "Name5" });
        RadGrid1.DataSource = list;
    }


    protected void RadGrid1_UpdateCommand(object sender, GridCommandEventArgs e)
    {

        GridEditableItem editedItem = e.Item as GridEditableItem;

        UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);
        string strName = (userControl.FindControl("TextBox1") as TextBox).Text; //Get usercontrol data
        string strName1 = (userControl as WebUserControl1).GetDataFromControls(); //Call the usercontrol Method
        //Perform your operation here
    }
}

ASCX

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl1.ascx.cs" Inherits="WebUserControl1" %>
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>

your Usercontrol......
<br />
<asp:Label ID="Label1" runat="server"></asp:Label>
<br />
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("Name") %>'></asp:TextBox>
<br />
<asp:Button ID="btnUpdate" Text="Update" runat="server" CommandName="Update"></asp:Button>

ASCX.CS

public partial class WebUserControl1 : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public string GetDataFromControls()
    {
        return TextBox1.Text;
    }
}

Let me know if any concern.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top