Ho una pagina che ho creato che genera dinamicamente i controlli utente. Ad esempio, il controllo utente ha due campi che possono essere modificati: SomeId e SomeData. Voglio essere in grado di impostare questi valori in base a un UserControlObject
. Quando leggerò il controllo in seguito, voglio essere in grado di restituire un controllo UserControlObject
e impostare i valori del database su quello. Sto avendo qualche problema a far sì che i valori rimangano aggiornati.I controlli utente dinamici acquisiscono e mantengono i valori dopo i postback
//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;
}
}
Fondamentalmente, voglio caricare ogni MyUserControl
con i valori da un database. Un utente dovrebbe essere in grado di modificare la maggior parte (ma non tutti) di quei campi. Un utente non dovrebbe essere in grado di modificare l'ID, ma ho bisogno che aggiorni il record nel database.
Ho difficoltà ad ottenere le informazioni da salvare e persistere correttamente, perché sto ricreando una raccolta di MyUserControl
. Sembra funzionare bene nel postback inital, ma dopo i successivi postback, ottengo ancora il vecchio valore per uno dei campi. Come posso assicurarmi che:
1) Le informazioni sono impostate correttamente sui controlli utente. Devo inserire una proprietà pubblica che faccia riferimento a viewstate su ogni proprietà di UserControl?
2) Dopo aver fatto clic su un evento di salvataggio, dopo il postback, la ricostruzione dei controlli non mi imporrà di mantenere alcun valore "vecchio" dal carico iniziale? Come dovrei gestire il viewstate qui? Voglio che i dati riflettano ciò che l'utente ha cambiato.
Sto provando a seguire il tuo codice, ci sono un paio di problemi che rendono difficile seguirlo. In 'InitControls()' hai un ciclo 'foreach', ma penso che tu intenda che sia un loop semplice, vero? per '(int i = 0; i
@Joel: è stata una lunga giornata ... ho apportato le correzioni :) –