【问题标题】:Getting data from child controls loaded programmatically从以编程方式加载的子控件获取数据
【发布时间】:2010-05-18 11:40:41
【问题描述】:

我创建了 2 个控件来操作数据对象:1 个用于查看,另一个用于编辑。

在一个页面上,我加载“视图”UserControl 并以这种方式将数据传递给它:

ViewControl control = (ViewControl)LoadControl("ViewControl.ascx");
control.dataToView = dataObject;
this.container.Controls.Add(control);

这一切都很好,在控件内部我可以抓取该数据并显示它。

现在我正在尝试采用类似的方法进行编辑。为此,我有一个不同的用户控件(带有一些用于编辑的文本框),我将原始数据传递给它,就像我为视图所做的那样:

EditControl control = (EditControl)LoadControl("EditControl.ascx");
control.dataToEdit = dataObject;
this.container.Controls.Add(control);

这也很好用。

现在的问题是获取这些数据。当用户单击按钮时,我需要获取已编辑的数据并对其进行处理。 发生的情况是,由于控件是以编程方式添加的,因此用户更改的数据似乎无法在任何地方访问。

有解决办法吗?还是这种试图将事物分开并可能重复使用的方式是不可能的?

提前致谢。

【问题讨论】:

    标签: asp.net user-controls webforms loadcontrol


    【解决方案1】:

    只需在页面的代码隐藏中保留对控件的引用作为变量。即

    private EditControl control;
    
    protected void Page_Init(object sender, EventArgs e)
    {
       control = (EditControl)LoadControl("EditControl.ascx");
       control.dataToEdit = dataObject;
       this.container.Controls.Add(control);
    }
    
    protected void Button_Click(object sender, EventArgs e)
    {
       var dataToEdit = control.dataToEdit; 
    }
    

    只要您在页面生命周期(初始化)的正确部分创建控件,就会维护ViewState。我假设 dataToEdit 只是 TextBox 或其他什么?

    【讨论】:

    • 这很有用,谢谢。这样我就不用去找占位符里面的控件了,我可以直接使用它的引用。
    【解决方案2】:

    动态创建的控件必须添加到页面上的InitPreInit 事件中。

    您必须在此处执行此操作,因为尚未加载控件状态。如果您在 AFTER 之后添加控件,则它们将为空,因为页面已经在页面生命周期的早期填充了控件页面值。

    更多关于页面生命周期的信息here

    【讨论】:

    • 您这么说很有趣,因为我在 Page_Load 事件中添加了控件,并且我仍然可以访问已加载控件的控件内的值。还有什么我应该注意的吗?
    【解决方案3】:

    这是我的解决方案:

    在页面中,我保留了对以编程方式加载的控件的引用。 在控件中,我创建了一个 GetData() 方法,该方法返回一个包含用户输入数据的对象。 当用户提交表单时,页面调用控件上的GetData()方法来访问用户输入的数据。

    【讨论】:

    • 所以你基本上用了我的答案,只是添加了另一种方法来返回控件的值?
    • 嗯,是的。我必须创建该方法,因为无法从我执行 LoadControl() 的页面访问控件的子控件。
    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多