Asp.net 从以编程方式加载的子控件获取数据

Asp.net 从以编程方式加载的子控件获取数据,asp.net,user-controls,webforms,loadcontrol,Asp.net,User Controls,Webforms,Loadcontrol,我创建了两个控件来操作数据对象:一个用于查看,另一个用于编辑 在一个页面上,我加载“视图”UserControl,并通过以下方式向其传递数据: ViewControl control = (ViewControl)LoadControl("ViewControl.ascx"); control.dataToView = dataObject; this.container.Controls.Add(control); 这一切都很好,在控件内,我可以抓取数据并显示它 现在我正尝试采用类似的方法进

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

在一个页面上,我加载“视图”
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);
这也很好用

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

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


提前感谢。

必须在页面上的
Init
PreInit
事件中添加动态创建的控件

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


关于页面生命周期的更多信息只需在页面代码中保留对控件的引用作为变量即可。即

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只是一个
文本框
或其他什么?

以下是我的解决方案:

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

您这么说很有意思,因为我正在页面加载事件上添加控件,并且我仍然可以访问加载控件控件内的值。还有什么我应该注意的吗?那很有用,谢谢。这样我就不需要在占位符中找到控件,我可以使用对它的引用。所以你基本上使用了我的答案,只是添加了另一个方法来返回控件的值?嗯,是的。我必须创建该方法,因为无法从执行LoadControl()的页面访问该控件的子控件。