Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态用户控件在回发后获取和维护值_C#_Asp.net_User Controls - Fatal编程技术网

C# 动态用户控件在回发后获取和维护值

C# 动态用户控件在回发后获取和维护值,c#,asp.net,user-controls,C#,Asp.net,User Controls,我创建了一个页面,动态生成用户控件。例如,用户控件有两个可以编辑的字段:SomeId和SomeData。我希望能够基于UserControlObject设置这些值。当我随后读取控件时,我希望能够从控件返回一个UserControlObject,并将数据库值设置为该值。我在获取最新的值时遇到了一些问题 //Page public class SomePage { private List<MyUserControl> _MyUserControls; private

我创建了一个页面,动态生成用户控件。例如,用户控件有两个可以编辑的字段: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;
  }
}
//第页
公共类页面
{
私有列表_MyUserControls;
私有控件()
{
var controlsToBuild=SomeDatabaseCallToGetControlObjects();
foreach(controlsToBuild中的MyUserControl控件)
{
MyUserControl=this.Page.LoadControl(“MyControl.ascx”)作为MyUserControl;
UserControlPlaceHolder.Controls.Add(myControl);
_添加(myControl);
}
}
受保护的无效页_Init(对象发送方,事件参数e)
{
InitControls();
}
受保护的无效保存按钮\u单击(对象发送者,事件参数e)
{
如果(this.IsValid)
{
listobj=新列表();
foreach(MyUserControls中的MyUserControl控件)
{
MyUserObject obj=control.GetObjectFromControl();
listObjs.Add(obj);
}
SaveToDatabase(listObjs);
//如果控件数量已根据保存更改,请清除占位符
UserControlPlaceHolder.Clear();
InitControls();
GetObjectFromDatabase();
}
}
}
//控制对象
公共类UserControlObject
{
公共字符串DataForUser{get;set;}
public double MoreDataForUser{get;set;}
public int HiddenIdFromUser{get;set;}
}
//用户控制
公共类MyUserControl:UserControl
{
公共MyUserControlObject GetObjectFromControl()
{
UserControlObject obj=新的UserControlObject();
obj.DataForUser=textboxontecontrol.Text;
obj.MoreDataForUser=econtrol.Text上的另一个框;
obj.HiddenIdFromUser=hiddenField.Value;
返回obj;
}
public void SetUserControlObject(UserControlObject obj)
{
textBoxOnTheControl.Text=obj.DataForUser;
CONTROL.Text上的另一个框=obj.MoreDataForUser;
hiddenField.Value=obj.HiddenIdFromUser;
}
}
基本上,我想用数据库中的值加载每个
MyUserControl
。用户应该能够更改这些字段中的大部分(但不是全部)。用户不能更改ID,但我需要它来更新数据库中的记录

由于我正在重新创建
MyUserControl
的集合,因此在正确保存和保存信息时遇到了一些问题。在初始回发上它似乎工作得很好,但是在后续回发之后,我仍然得到其中一个字段的旧值。我如何确保:

1) 信息已正确设置为用户控件。我是否需要在UserControl的每个属性上放置引用viewstate的公共属性


2) 单击保存事件后,在回发后,重建控件不会导致我保留初始加载中的任何“旧”值?我应该如何处理这里的viewstate?我希望数据反映用户所做的任何更改。

要使视图状态/控件状态正常工作,控件必须具有相同的ID。由于您没有显式地分配ID,所以必须生成ID,并且如果存在多个用户控件,则会发生冲突。我建议您使用某种逻辑在回发上生成相同的ID集。比如说,

private void InitControls()
{
  var numControlsToBuild = SomeDatabaseCallToGetNumControls();
  int idCounter = 1;
  foreach(var controlData in numControlsToBuild)
  {
    var control = this.Page.LoadControl("MyControl.ascx") as MyUserControl;
    control.ID = "MyControl" + idCounter.ToString();
    idCounter++;
    UserControlPlaceHolder.Controls.Add(myControl);
    _MyUserControls.Add(control);

    // probably code load control data into control
  }
}

正如VinayC所指出的,这里的基本问题是,当您向页面动态添加控件时,如果您没有为这些控件分配ID,那么将为它们提供生成的ID。如果动态生成的控件的数量发生更改,或者创建它们的顺序发生更改,则动态创建的web控件与视图状态中这些对象的状态信息之间将不匹配。类似地,动态创建的web控件的ID与POST标题中查询参数的ID之间也会不匹配。这意味着某些字段的值不会从POST数据中更新

视图状态ID不匹配将导致标签和文字等恢复为初始值。另一方面,POST数据ID不匹配将导致输入字段恢复为初始值。如果您在输入字段恢复为初始值时遇到问题,使用视图状态将无法解决问题。在视图状态中持久化字段值是一种常见的误解。但是,这是不必要的,因为输入字段值已经包含在POST数据中。有关视图状态如何工作的详细讨论,请参见Scott Mitchell


如果您总是按照相同的顺序创建动态添加的控件,那么正如VinayC指出的那样,您可以生成一系列ID,例如“ID1”、“ID2”、“ID3”。。。当您创建web控件时。在您的情况下,由于要将用户控件字段值存储在数据库中,因此您可能希望仅为每个用户控件生成一次新ID,并将生成的每个ID与相关字段值一起存储在数据库中。这样,您就不必担心创建控件的顺序。

我正在尝试按照您的代码进行操作。有几个问题让您很难遵循。在
InitControls()
中,您有一个
foreach
循环,但我认为您希望它是一个简单的循环,不是吗?i、 e.
for(int i=0;i@Joel当前位置这是漫长的一天…我已经做了更正:)+1这确实是这里的核心问题。我将发布另一个答案,更详细一点。这解决了问题。谢谢你的意见。