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

Data Lost from UserControl when I use RadGrid EditForm with UserControl

4 Answers 113 Views
Grid
This is a migrated thread and some comments may be shown as answers.
HHH
Top achievements
Rank 1
HHH asked on 24 Mar 2014, 07:21 AM
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)
My UC Picture


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;
        }

 store Id in session for Updating
        protected void personGrid_EditCommand(object sender, GridCommandEventArgs e)
        {
            var sKey = typeof (Person).FullName + "Keys";
            var id = (int)((GridDataItem)e.Item).GetDataKeyValue("ID");
            SessionManager.Instance[sKey] = id;
        }

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 ???

4 Answers, 1 is accepted

Sort by
0
Accepted
Jayesh Goyani
Top achievements
Rank 2
answered on 24 Mar 2014, 09:32 AM
Hello,

Please try with the below code snippet.

ASPX
<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>

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.

Thanks,
Jayesh Goyani
0
HHH
Top achievements
Rank 1
answered on 24 Mar 2014, 11:20 AM
oh YESSSS

Page_Load in Page.aspx is forbidden !!!!!!!!   :D
0
HHH
Top achievements
Rank 1
answered on 24 Mar 2014, 12:02 PM
Thank you so much Dear Jayesh Goyani

but another problem !!!

consider this block of code


<asp:Button ID="btnUpdate" Text="Update" runat="server" CommandName="Update" Visible='<%# !(DataItem is Telerik.Web.UI.GridInsertionObject) %>'> </asp:Button>
<asp:Button ID="btnInsert" Text="Insert" runat="server" CommandName="PerformInsert" Visible='<%# DataItem is Telerik.Web.UI.GridInsertionObject %>'></asp:Button>

my question is Visible property
when I use above code (same as telerik sample ) in usercontrol
page show an error The name 'DataItem' does not exist in the current context

why I cant see DataItem ???







































0
Jayesh Goyani
Top achievements
Rank 2
answered on 24 Mar 2014, 12:50 PM
Hello,

Please check IBindableControl in below link.

http://www.telerik.com/help/aspnet-ajax/grid-linq-to-sql-data-binding-crud-operations.html

Thanks,
Jayesh Goyani
Tags
Grid
Asked by
HHH
Top achievements
Rank 1
Answers by
Jayesh Goyani
Top achievements
Rank 2
HHH
Top achievements
Rank 1
Share this question
or