0

我创建了 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);

这也可以正常工作。

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

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

提前致谢。

4

3 回答 3

2

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

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

于 2010-05-18T12:03:16.890 回答
0

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

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

有关页面生命周期的更多信息在这里

于 2010-05-18T11:55:43.380 回答
0

这是我的解决方案:

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

于 2010-05-27T11:30:05.613 回答