Tôi có một trang mà tôi đã tạo tự động tạo điều khiển người dùng. Ví dụ, điều khiển người dùng có hai trường có thể được chỉnh sửa: SomeId và SomeData. Tôi muốn có thể đặt các giá trị này dựa trên UserControlObject
. Khi tôi đọc điều khiển sau đó, tôi muốn có thể trả lại một UserControlObject
từ điều khiển và thiết lập các giá trị cơ sở dữ liệu cho điều đó. Tôi đang gặp một số vấn đề khi nhận được các giá trị để luôn cập nhật.Điều khiển người dùng động nhận và duy trì giá trị sau khi đăng lại
//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;
}
}
Về cơ bản, tôi muốn tải lên mỗi giá trị từ một cơ sở dữ liệu. Người dùng có thể thay đổi hầu hết (nhưng không phải tất cả) của các trường đó. Người dùng không thể thay đổi ID, nhưng tôi cần nó để cập nhật bản ghi trong cơ sở dữ liệu.
Tôi đang gặp một số sự cố khi nhận thông tin để lưu và duy trì chính xác, vì tôi đang tạo lại một bộ sưu tập gồm MyUserControl
. Dường như nó hoạt động tốt trên postback inital, nhưng sau postback tiếp theo, tôi vẫn nhận được giá trị cũ cho một trong các trường. Làm cách nào để đảm bảo rằng:
1) Thông tin được đặt thành (các) điều khiển người dùng một cách chính xác. Tôi có cần đặt thuộc tính công khai tham chiếu ViewState trên mọi thuộc tính của UserControl không?
2) Sau khi nhấp vào sự kiện lưu, sau khi đăng lại, việc xây dựng lại các điều khiển sẽ không khiến tôi giữ lại bất kỳ giá trị "cũ" nào từ lần tải đầu tiên? Làm thế nào tôi nên xử lý các ViewState ở đây? Tôi muốn dữ liệu phản ánh những gì người dùng đã thay đổi.
Tôi đang cố gắng theo dõi mã của bạn có một số vấn đề khiến bạn khó theo dõi. Trong 'InitControls()' bạn có một vòng lặp 'foreach', nhưng tôi nghĩ bạn dự định là một vòng lặp đơn giản phải không? tức là 'cho (int i = 0; i
@ Joel: Đã lâu rồi ... Tôi đã thực hiện các chỉnh sửa :) –