我创建了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);
这也很好。
现在的问题是获取这些数据。当用户单击一个按钮时,我需要获取已编辑的数据并使用它进行处理。 发生的事情是,因为控件是以编程方式添加的,所以用户更改的数据似乎无法在任何地方访问。
有解决方案吗?或者这种尝试将事物分开并且可能无法重复使用的方法是什么?
提前致谢。
答案 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)
必须在页面上的Init
或PreInit
事件中添加动态创建的控件。
你必须在这里做,因为控件状态尚未加载。如果您在页面生命周期的早期页面已经填充了控制页面值,那么在您将它们清空后添加控件。
有关页面生命周期的更多信息here
答案 2 :(得分:0)
这是我的解决方案:
在页面中,我保留对以编程方式加载的控件的引用。 在控件中,我创建了一个GetData()方法,该方法返回一个包含用户输入数据的对象。 当用户提交表单时,页面调用控件上的GetData()方法来访问用户输入的数据。