Domanda

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

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top