我有一个页面,我已经建立了动态生成用户控件。例如,用户控件有两个可以编辑的字段: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
2011-03-25 04:38:14
@Joel:这是一个漫长的一天......我已经做出了更正:) – 2011-03-25 05:01:50