У меня есть созданная страница, которая динамически генерирует пользовательские элементы управления.Например, пользовательский элемент управления имеет два поля, которые можно редактировать: 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
значениями из базы данных.Пользователь должен иметь возможность изменять большинство (но не все) из этих полей.Пользователь не должен иметь возможность изменить идентификатор, но мне нужно, чтобы он обновил запись в базе данных.
У меня возникли проблемы с получением информации для сохранения и правильного сохранения, потому что я воссоздаюколлекция MyUserControl
.Кажется, что он отлично работает на исходной обратной передаче, но после последующих обратных передач я все еще получаю старое значение для одного из полей.Как я могу гарантировать, что:
1) Информация правильно установлена для пользовательского элемента (ов).Нужно ли помещать открытое свойство, ссылающееся на viewstate, на каждое свойство UserControl?
2) После нажатия на событие сохранения, после обратной передачи, перестроение элементов управления не заставит меня сохранятькакие-нибудь "старые" значения из начальной загрузки?Как я должен обрабатывать состояние просмотра здесь?Я хочу, чтобы данные отражали то, что изменил пользователь.