У меня есть страница, которую я создал, которая динамически генерирует пользовательские элементы управления. Например, пользовательский элемент управления имеет два поля, которые можно редактировать: 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
. Кажется, что он отлично работает на основе обратной обратной связи, но после последующих postbacks я все еще получаю старое значение для одного из полей. Как я могу убедиться, что:
1) Информация правильно установлена на пользовательские элементы управления. Нужно ли включать публичное свойство, ссылающееся на viewstate на каждый свойство UserControl?
2) После нажатия события сохранения после обратной передачи перестройка элементов управления не заставит меня сохранить какие-либо «старые» значения от начальной загрузки? Как мне обращаться с представлением здесь? Я хочу, чтобы данные отражали то, что изменил пользователь.
Я пытаюсь следовать вашему коду, есть несколько проблем, из-за которых трудно следовать. В 'InitControls()' у вас есть цикл foreach', но я думаю, вы намерены, что это простой цикл, не так ли? то есть 'for (int i = 0; i
@Joel: Это был долгий день ... Я внес коррективы :) –