动态用户控件在回发后获取并保持值我有一个我构建的页面动态生成用户控件。例如,用户控件有两个可编辑字段:SomeId和SomeData。我希望能够基于UserControlObject设置这些值。当我之后读取控件时,我希望能够从控件返回一个UserControlObject并将数据库值设置为该控件。我在保持这些值最新时遇到了一些麻烦。//页面publicclassSomePage{privateList_MyUserControls;privatevoidInitControls(){varcontrolsToBuild=SomeDatabaseCallToGetControlObjects();foreach(controlsToBuild中的MyUserControl控件){MyUserControlcontrol=this.Page.LoadControl("MyControl.ascx")asMyUserControl;UserControlPlaceHolder.Controls.Add(myControl);_MyUserControls.Add(myControl);}}protectedvoidPage_Init(objectsender,EventArgse){InitControls();}protectedvoidSaveButton_Click(objectsender,EventArgse){if(this.IsValid){ListlistObj=newList();foreach(_MyUserControls中的MyUserControl控件){MyUserObjectobj=control.GetObjectFromControl();listObjs.Add(obj);}SaveToDatabase(listObjs);//清除占位符,以防基于保存的控件数量发生变化UserControlPlaceHolder.Clear();初始化控件();GetObjectFromDatabase();}}}//要控制的对象publicclassUserControlObject{publicstringDataForUser{get;set;}publicdoubleMoreDataForUser{get;set;}publicintHiddenIdFromUser{get;set;}}//用户控件publicclassMyUserControl:UserControl{publicMyUserControlObjectGetObjectFromControl(){UserControlObjectobj=newUserControlObject();obj.DataForUser=textBoxOnTheControl.Text;obj.MoreDataForUser=anotherBoxOnTheControl.Text;obj.HiddenIdFromUser=hiddenField.Value;返回对象;}publicvoidSetUserControlObject(UserControlObjectobj){textBoxOnTheControl.Text=obj.DataForUser;anotherBoxOnTheControl.Text=obj.MoreDataForUser;hiddenField.Value=obj.HiddenIdFromUser;基本上,我想用数据库中的值加载每个MyUserControl用户应该能够更改这些字段中的大部分(但不是全部)。用户不应该能够更改ID,但我需要它来更新数据库中的记录。因为我正在重新创建MyUserControl的集合,所以我在获取信息以保存和正确保存时遇到了一些麻烦。它在初始回发时似乎工作正常,但在随后的回发后,我仍然获得其中一个字段的旧值。我怎样才能确定:1)信息被正确地设置到用户控件。我是否需要在UserControl的每个属性上放置一个引用视图状态的公共属性?2)点击保存事件后,回发后,重建控件不会导致我保留初始加载的任何“旧”值?我应该如何处理视图状态?我希望数据反映用户所做的更改。要使viewstate/controlstate正常工作,您的控件必须具有相同的ID。由于您没有明确分配ID,因此必须生成它,并且与拥有多个用户控件存在冲突。我建议您有一些逻辑来生成同一组ID回发。例如,privatevoidInitControls(){varnumControlsToBuild=SomeDatabaseCallToGetNumControls();intidCounter=1;foreach(varcontrolDatainnumControlsToBuild){varcontrol=this.Page.LoadControl("MyControl.ascx")asMyUserControl;control.ID="MyControl"+idCounter.ToString();id计数器++;UserControlPlaceHolder.Controls.Add(myControl);_MyUserControls.Add(控制);//可能代码将控件数据加载到控件中}}正如VinayC所指出的,这里的根本问题是,当您动态地将控件添加到页面时,如果您不为这些控件分配ID,它们将获得生成的ID。如果动态生成的控件数量发生变化,或者它们的创建顺序发生变化,则动态创建的Web控件与视图状态中这些对象的状态信息将不匹配。此外,动态创建的Web控件的ID与POST标头中的查询参数的ID不匹配。这意味着某些字段的值不是从POST数据中更新的。视图状态ID不匹配会导致标签和文本等内容恢复为初始值。另一方面,POST数据ID不匹配将导致输入字段恢复为初始值。如果您在将输入字段恢复为初始值时遇到问题,查看状态将无济于事。一个常见的误解是字段值持久化在视图状态中。然而,这是不必要的,因为输入字段值已经包含在POST数据中。有关ViewState如何工作的详细讨论,请参阅ScottMitchell的UnderstandingHowViewStateWorks。如果您总是以相同的顺序创建动态添加的控件,那么,正如VinayC指出的那样,您可以生成一系列ID,例如“ID1”、“ID2”、“ID3”……因为您正在创建Web控件。在您的情况下,由于您将用户控件字段值存储在数据库中,您可能只想为每个用户控件生成一次新ID,并将每个生成的ID与关联的字段值一起存储在数据库中。这样,您就不必担心控件的创建顺序。以上就是C#学习教程:动态用户控件postback后获取并维护值共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表作品如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
