MSPlus WebControls For ASP.NET. (服务器端控件)

Upgrade Develop Efficiency,Surprise For U! - Mack.Z

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  22 随笔 :: 42 文章 :: 901 评论 :: 14 Trackbacks
今天又收到一个网友的留言:

本人在开发一个复合控件过程中存在一个问题,向您请教。某复合控件中包含一个ListBox服务器子控件,该子控件的数据是通过在Page_load中绑定上去的。整个控件呈现到客户端之后,通过客户端脚本对该ListBox子控件的项,进行了操作,例如删除、修改。但是当页面提交之后(通过Button),返回的结果中无法保存对ListBox处理的结果。
目前,我想让客户端处理的结果在页面提交之后,再次呈现在客户端时能够保存下来,不知道该如何处理?

对于这个问题的解决办法如下:


建议你在复合控件中在增加一个隐藏的HiddenText子控件.
System.Web.UI.WebControls.ListBox BoxControl = new System.Web.UI.WebControls.ListBox();
System.Web.UI.HtmlControls.HtmlInputHidden HiddenText 
= new System.Web.UI.HtmlControls.HtmlInputHidden();
 


第一步:
因为你数据源要绑定的是ListBox, ListBox需要设定两个绑定字段的属性 DataTextField和DataValueField
你在第一次进行数据源绑定时,你可以将DataTable转换成一组自定义的XML标签.

<Text="显示值一" Value="内容值一">
<Text="显示值二" Value="内容值二">
<Text="显示值三" Value="内容值三">

以上的这串字符就是你自定义的数据结构,对于以后子控件DataList的绑定,就不在是用你的DataSource,而是用以上这串字符串.
所在我们在对控件应行绑定时只需要在第一次载入时进行绑定就可以了

private void Page_Load(object sender, System.EventArgs e)
{
 
if(!this.IsPostBack)
 
{
  自定义控件.DataSource 
= DataTable;
  自定义控件.DataBind();
 }

}


第二步:
如何将自定义标签于DATALIST绑定,因为之前自己定义的字符串其实就是一个XML结构的数据.
我用可以用.NET里的XmlDocument类进行操作

XmlDocument mXmlData = new 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一起呈现出来

protected override void Render(HtmlTextWriter pOutPut) 
{
 HiddenText.RenderControl(pOutPut);
 BoxControl.RenderControl(pOutPut);
}


第五步:
这时你在IE里运行你的子控件,因为我们将结构已存在HiddenBox这个控件中
你在客户端增加和删除或修改时,需要对这个HiddenBox中的自定义Xml数据进行相应的维护.
For Example:
比现在在IE中HiddenText的值是这样的

<Input Type="Hidden" ID="HiddenText" Value="<I Text="显示值一" Value="内容值一"><Text="显示值二" Value="内容值二">">


我们通过客户端新增了一个后,他的值应变为如下:

<Input Type="Hidden" ID="HiddenText"  Value="<I Text="显示值一" Value="内容值一"><Text="显示值二" Value="内容值二"><Text="显示值三" Value="内容值三">">

以后我们通过其他的服务器端控件比如BUTTON进行DOPOSTBACK操作时,HiddenText的值也将会随时传回服务器端,因为我们实际上对LISTBOX进行绑定是用的自定义的XML标签,也就是HIDDENTEXT的值,一般DOPOSTBACK 后,复合控件也就能获取到最新的XML数据.
这样你在客户端中的变化也就能在服务器端反映出来了,HIDDENTEXT在这里的作用也就是一个客户端和服务器端进行交流的工具.

posted on 2004-08-23 14:38 Mack.Z 阅读(3621) 评论(4)  编辑 收藏 所属分类: 控件开发

评论

#1楼  2004-08-23 15:37 polaris      
可是这种做法还不够完美。
在给你发这个帖子之前,我已经完成了你说的这种方法,但是这种方法存在的问题是:不符合通用的习惯。
我们在使用单独的ListBox控件过程中,是使用listbox的items属性(该属性为ListItemCollection数据类型)来获取listbox中的所有项。而目前的解决办法是无法完成这样的功能。
最好的解决办法是通过使用子控件的items属性来获取。这就是该复合控件的难点所在。

根据我的推测:ListBox自身的状态管理好像没有对所有的项的管理,也就是说无法保持所有的项的状态。当客户端对其项进行操作并提交之后,.net的状态管理功能没有提交有关客户端操作的项的状态,由此当页面再次刷新时,ListBox的项又回到了最开始的状态。

以上是我的浅见,悉听指导。
  回复  引用  查看    

#2楼  2004-08-24 13:05 polaris      
我看到一种方法是使用IHttpHandler处理,虽然有些麻烦,但是非常有效。
  回复  引用  查看    

#3楼  2004-09-02 08:51 新手 [未注册用户]
你好,我想注册用户好像不行,我想问个问题。是这样的。
首先我下载程序后,打开时,提示目录什么的不对。怎么解决这个问题,如何调试呀。谢谢你了。我是新手,我对CS是有研究的,BS不太会。麻烦你了,好心人。
  回复  引用    

#4楼  2004-09-22 08:01 新手 [未注册用户]
我在使用自定义控件的时候,遇到奇怪的问题,恳请高手解答:
自定义控件包含一个DataGird,每点击一次新增按钮,添加一个新项。问题是每当我按新增按钮后,按F5刷新页面,结果新增按钮的时间会被自动触发,相同的记录重新添加一次。
我分析问题可能是刷新的时候,页面将所有的状态,包括事件都重新提交了一遍,不知道该如何解决。
  回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交