本人在开发一个复合控件过程中存在一个问题,向您请教。某复合控件中包含一个ListBox服务器子控件,该子控件的数据是通过在Page_load中绑定上去的。整个控件呈现到客户端之后,通过客户端脚本对该ListBox子控件的项,进行了操作,例如删除、修改。但是当页面提交之后(通过Button),返回的结果中无法保存对ListBox处理的结果。
目前,我想让客户端处理的结果在页面提交之后,再次呈现在客户端时能够保存下来,不知道该如何处理?
对于这个问题的解决办法如下:
建议你在复合控件中在增加一个隐藏的HiddenText子控件.
System.Web.UI.HtmlControls.HtmlInputHidden HiddenText = new System.Web.UI.HtmlControls.HtmlInputHidden();
第一步:
因为你数据源要绑定的是ListBox, ListBox需要设定两个绑定字段的属性 DataTextField和DataValueField
你在第一次进行数据源绑定时,你可以将DataTable转换成一组自定义的XML标签.
<I Text="显示值二" Value="内容值二">
<I Text="显示值三" Value="内容值三">
以上的这串字符就是你自定义的数据结构,对于以后子控件DataList的绑定,就不在是用你的DataSource,而是用以上这串字符串.
所在我们在对控件应行绑定时只需要在第一次载入时进行绑定就可以了
{
if(!this.IsPostBack)
{
自定义控件.DataSource = DataTable;
自定义控件.DataBind();
}
}
第二步:
如何将自定义标签于DATALIST绑定,因为之前自己定义的字符串其实就是一个XML结构的数据.
我用可以用.NET里的XmlDocument类进行操作
mXmlData.LoadXml(<I Text="显示值一" Value="内容值一"><I Text="显示值二" Value="内容值二">)
循环对Xml中的节点进行取值
foreach(XmlNode iNode in mXmlData.ChildNodes)
{
//这里是根据XML数据来创建ListItem项
Using(ListItem iItem = new ListItem())
{
iItem.text = iItem.Attributes.GetNamedItem("Text");
iItem.value = iItem.Attributes.GetNamedItem("Value");
BoxControl.Items.add(iItem);
}
}
第三步:
重写 void CreateChildControls() 方法,将HiddenText和BoxControl加为复合控件中的子控件
第四步:
在呈现时,把ListBox和HiddenText一起呈现出来
{
HiddenText.RenderControl(pOutPut);
BoxControl.RenderControl(pOutPut);
}
第五步:
这时你在IE里运行你的子控件,因为我们将结构已存在HiddenBox这个控件中
你在客户端增加和删除或修改时,需要对这个HiddenBox中的自定义Xml数据进行相应的维护.
For Example:
比现在在IE中HiddenText的值是这样的
我们通过客户端新增了一个后,他的值应变为如下:
以后我们通过其他的服务器端控件比如BUTTON进行DOPOSTBACK操作时,HiddenText的值也将会随时传回服务器端,因为我们实际上对LISTBOX进行绑定是用的自定义的XML标签,也就是HIDDENTEXT的值,一般DOPOSTBACK 后,复合控件也就能获取到最新的XML数据.
这样你在客户端中的变化也就能在服务器端反映出来了,HIDDENTEXT在这里的作用也就是一个客户端和服务器端进行交流的工具.