当我使用RadGrid EditForm和UserControl时,数据从UserControl丢失

时间:2014-03-24 07:02:59

标签: c# asp.net user-controls telerik radgrid

我将RadGrid EditForm与UserControl一起使用,就像这个样本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>

我有这样的UserControl(有人事信息数据) enter image description here

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

可以从文本框和其他控件中获取数据并设置为Person instanse 好的,现在我想更新数据,所以在我的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);
    }
}

首先我在UpdateCommand方法中找到了我的usercontrol,然后调用了GetDataFromControls方法,但除了从Session获取的ID以外的其他数据丢失了!所有文本框都是空的

如何使用有效数据调用GetDataFromControls()方法?

我想到的另一个解决方案是通过此属性将GetDataFromControls保存到Session

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

然后调用CurrentEntity而不是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);
        }
    }

我不知道何时将哪个事件中的CurrentEntity填入我的UserControl?

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

任何人都可以建议在Page.aspx中从UserControl调用GetDataFromControls而不会丢失数据的良好解决方案???

1 个答案:

答案 0 :(得分:0)

请尝试使用以下代码段。

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

如果有任何疑虑,请告诉我。