동적으로 사용자 컨트롤을 생성하는 페이지가 있습니다. 예를 들어, 사용자 정의 컨트롤에는 편집 할 수있는 두 개의 필드, 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
컬렉션을 다시 만들고 있기 때문에 정보를 저장하고 올바르게 유지하는 데 문제가 있습니다. inital postback에서 잘 작동하는 것처럼 보이지만 후속 postback 후에도 필드 중 하나에 대해 이전 값을 얻습니다. 어떻게해야합니까 :
1) 정보가 사용자 정의 컨트롤에 올바르게 설정되었습니다. viewContent를 참조하는 public 속성을 에 넣어야합니까? UserControl 속성마다?
2) 저장 이벤트를 클릭 한 후 다시 게시 한 후에 컨트롤을 다시 작성해도 초기로드의 "이전"값은 유지되지 않습니까? viewstate는 어떻게 처리해야합니까? 데이터가 사용자가 변경 한 내용을 반영하도록합니다.
나는 당신의 코드를 따르려고 노력하고 있는데, 따라하기 힘든 몇 가지 문제가있다. 'InitControls()'에서'foreach' 루프가 있지만, 단순한 루프가되도록하려는 것 같습니까? 즉 for (int i = 0; i
@Joel : 긴 하루였습니다 ... 나는 수정했습니다 :) –