【发布时间】:2011-07-22 15:43:36
【问题描述】:
我已经构建了一个动态生成用户控件的页面。例如,用户控件有两个可以编辑的字段:SomeId 和 SomeData。我希望能够基于UserControlObject 设置这些值。之后当我读取控件时,我希望能够从控件返回 UserControlObject 并将数据库值设置为该值。我无法让这些值保持最新状态。
//Page
public class SomePage
{
private List<MyUserControl> _MyUserControls;
private void InitControls()
{
var controlsToBuild = SomeDatabaseCallToGetControlObjects();
foreach(MyUserControl control in controlsToBuild)
{
MyUserControl control = this.Page.LoadControl("MyControl.ascx") as MyUserControl;
UserControlPlaceHolder.Controls.Add(myControl);
_MyUserControls.Add(myControl);
}
}
protected void Page_Init(object sender, EventArgs e)
{
InitControls();
}
protected void SaveButton_Click(object sender, EventArgs e)
{
if (this.IsValid)
{
List<MyUserObject>listObj = new List<MyUserObject>();
foreach(MyUserControl control in _MyUserControls)
{
MyUserObject obj = control.GetObjectFromControl();
listObjs.Add(obj);
}
SaveToDatabase(listObjs);
//Clear placeholder in case number of controls has changed based on the save
UserControlPlaceHolder.Clear();
InitControls();
GetObjectFromDatabase();
}
}
}
//Object to put in control
public class UserControlObject
{
public string DataForUser { get;set;}
public double MoreDataForUser { get;set;}
public int HiddenIdFromUser { get; set;}
}
//User control
public class MyUserControl : UserControl
{
public MyUserControlObject GetObjectFromControl()
{
UserControlObject obj = new UserControlObject();
obj.DataForUser = textBoxOnTheControl.Text;
obj.MoreDataForUser = anotherBoxOnTheControl.Text;
obj.HiddenIdFromUser = hiddenField.Value;
return obj;
}
public void SetUserControlObject(UserControlObject obj)
{
textBoxOnTheControl.Text = obj.DataForUser;
anotherBoxOnTheControl.Text = obj.MoreDataForUser;
hiddenField.Value = obj.HiddenIdFromUser;
}
}
基本上,我想为每个MyUserControl 加载数据库中的值。用户应该能够更改大部分(但不是全部)这些字段。用户应该不能更改 ID,但我需要它来更新数据库中的记录。
我在获取信息以正确保存和保留时遇到了一些问题,因为我正在重新创建 MyUserControl 的集合。它似乎在初始回发时工作正常,但在随后的回发之后,我仍然得到其中一个字段的旧值。我如何确保:
1) 信息已正确设置到用户控件。我是否需要在 UserControl 的 每个 属性上放置一个引用视图状态的公共属性?
2) 单击保存事件后,在回发后,重建控件不会导致我保留初始加载的任何“旧”值?我应该如何处理这里的视图状态?我希望数据能够反映用户所做的任何更改。
【问题讨论】:
-
我正在尝试遵循您的代码,但存在一些难以遵循的问题。在
InitControls()中,您有一个foreach循环,但我认为您打算将其作为一个简单的循环,不是吗?即for (int i=0; i<numControlsToBuild) .... Also, the code is modifying the loop variablecontrol, which can't be what you want. At the end, the methodSetUserControlObject`忽略传入参数obj,然后有几个对_UserControlObject的引用。你的意思是在那里引用obj? -
@Joel:这是漫长的一天......我已经进行了更正:)
标签: c# asp.net user-controls