ユーザーコントロールを動的に生成している私が構築したページがあります。たとえば、ユーザーコントロールには、編集可能な2つのフィールド、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つに古い値が残っています。
1)情報がユーザーコントロールに正しく設定されていること。 UserControlのプロパティごとに、ビューステートを参照するpublicプロパティをに配置する必要がありますか?
2)保存イベントをクリックした後、ポストバック後、コントロールを再構築しても、最初の負荷からの「古い」値は保持されません。ここでviewstateをどのように扱うべきですか?ユーザーが変更した内容を反映させたい
私はあなたのコードに従うことを試みていますが、それに追従するのが難しいいくつかの問題があります。 'InitControls()'には 'foreach'ループがありますが、単純なループであることを意図していると思いますか?すなわちfor(int i = 0; i
@Joel:それは長い一日だった...私は修正を行った:) –