以编程方式从子控件中获取数据

时间:2010-05-18 11:40:42

标签: asp.net user-controls webforms loadcontrol

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

在一个页面上,我加载了“view”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);

这也很好。

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

有解决方案吗?或者这种尝试将事物分开并且可能无法重复使用的方法是什么?

提前致谢。

3 个答案:

答案 0 :(得分:2)

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

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或什么?

答案 1 :(得分:0)

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

你必须在这里做,因为控件状态尚未加载。如果您在页面生命周期的早期页面已经填充了控制页面值,那么在您将它们清空后添加控件。

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

答案 2 :(得分:0)

这是我的解决方案:

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