Tengo una página que he creado que genera dinámicamente controles de usuario. Por ejemplo, el control de usuario tiene dos campos que se pueden editar: SomeId y SomeData. Quiero poder establecer estos valores según un UserControlObject
. Cuando leo el control después, quiero poder devolver un UserControlObject
desde el control y configurar los valores de la base de datos para eso. Tengo problemas para mantener los valores actualizados.Los controles de usuario dinámicos obtienen y mantienen valores después de las devoluciones de datos
//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;
}
}
Básicamente, quiero que cargar cada MyUserControl
con los valores de una base de datos. Un usuario debería poder cambiar la mayoría (pero no todos) de esos campos. Un usuario no debería poder cambiar la ID, pero necesito actualizar el registro en la base de datos.
Tengo problemas para guardar la información y conservarla correctamente, porque estoy volviendo a crear una colección de MyUserControl
. Parece funcionar bien en la devolución de datos inicial, pero después de posteriores devoluciones de datos, todavía obtengo el valor anterior para uno de los campos. ¿Cómo puedo asegurarme de que:
1) La información se establece correctamente en el/los control (es) del usuario. ¿Debo colocar una propiedad pública que haga referencia a viewstate en cada propiedad del UserControl?
2) ¿Después de hacer clic en un evento de guardar, después de la devolución de datos, la reconstrucción de los controles no me hará retener ningún valor "anterior" de la carga inicial? ¿Cómo debo manejar viewstate aquí? Quiero que los datos reflejen todo lo que el usuario ha cambiado.
Estoy tratando de seguir su código, hay un par de problemas que lo hacen difícil de seguir. En 'InitControls()' tiene un bucle 'foreach', pero creo que tiene la intención de que sea un bucle simple, ¿no? es decir, 'for (int i = 0; i
@Joel: Ha sido un día largo ... He hecho las correcciones :) –