自从 9月未开始写关于"ICONIX方法"的系列文章以来,到今天已有两个多月了,当初因为兴趣点的转移才划一
段落的Discuz!NT 系列文章,从今天开始又要开始续写了。这写这个系列以来,大家对我写的内容也是包贬不一,
其实这也是众口难调所致,我会在接下来的几篇随笔中尽力顾及大家的感受和阅读口味。最后还是希望大家能支持我们

的这个开源项目。

    好了,开始今天的话题!

    先请大家看一下这个控件运行时的效果图:

    效果图1: datagrid_1.JPG
 Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]

 

    效果图2: datagrid_2.JPG

   Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]

   
    需要说明的是写这个控件(继承自.net DataGrid 控件)的动机:
   
    其实在产品早期,为了提高开发速度。我们最先使用的是Component Art 控件库中的DataGrid控件,相信园子
里肯定有人用过这个商业控件库,甚至研究过它。从我个人感受看,我只能是“NB”来形容它了,首先是它的使用习惯
和方法名称非常接近(甚至完全相同)于我们所熟悉的Microsoft .NET DataGrid 控件,另外就是它的功能比微软
的DataGrid强大得不是一点半点,是那种“很好很强大”的东东。我在这里要向那些致力于控件开发的朋友推荐这个
控件库,相信大家会从它的源码中学到很多有益的东西。

    如果这里有些朋友还不知道它的话,建议大家看看 CS(这里可不是"反恐精英"呀),这个开源社区软件里的控件
库就用的是Component Art。

    言归正传吧,因为Component Art是商业控件库,如果使用的话会有许多问题(如授权等)。所以在Discuz!NT
1.0 正式版推出前, 我们的相应代码基本上都又再次回到了 Microsoft .NET DataGrid上了,同时考虑到所开发的
代码要适用于.net1.0-.net2.0,所以没有使用.net2.0中的DataView控件。
   
    即然决定使用Microsoft .NET DataGrid,那么就要看看它到底适不适合我们这个项目了:) ,因为之前已完成
了后台的编码工作,而剩下的就是在确保少修改代码,甚至减少代码量的基础上使用这个控件来摆脱Component Art。

    在减少代码量的方面,这里对“原始”的DataGrid进行了不少的封装, 如下:

    1.绑定数据部分,为了实现只给一条 SQL语句,就完成数据绑定的设计,我在继承自DataGrid的类中写了如下
方法:

  

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]//添加表类型对象
 2Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]        public void BindData(string sqlstring)
 3

    2.加载编辑列和删除列按钮的方法如下:

        

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]public void LoadEditColumn()
 2

    3.在点击编辑,取消和跳转指定分页上也进行了封装如下:
       

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码] public void EditByItemIndex(int itemindex)
 2

    4.点击表头的排序任务通过下面的属性来完成:

 

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]private string sort;
 2Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]
 3Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]        [Bindable(true), Category("Appearance"), DefaultValue("")]
 4Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]        public string Sort
 5

 
        而SortTable函数的声明如下:

 

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]public void SortTable(string SortExpression, DataTable dt)
 2

        而里面的DataGridSortType属性, 即标识当前是升序还是降序排列当前表字段:

       

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码] [Description("表头的名称。"), Category("Appearance"), DefaultValue("ASC")]
 2Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]        public string DataGridSortType
 3

    5.当按表头某字段进行排序时,在字段名称后添加“向下”或“向上”箭头icon。这里为了实现和使用方便,在
继承自datagrid的基础上绑定(详见构造函数)并实现了SortGrid方法(下面代码比较简单,就不做说明了):

 

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]protected void SortGrid(Object sender, DataGridSortCommandEventArgs e)
 2

    6.当鼠标在数据行间移动时的背景颜色变化的效果也设置在了控件中,相应的代码段如下:

   

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]  public void DataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
 2

    
    通过上面的一番"折腾",使用原来很好用的datagrid在使用上进一步“代码瘦身”,相应的CS代码也相应的变成了
下面的样子(数据表通过运行下载包中的SQL脚本创建即可):

 

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]protected void Page_Load(object sender, EventArgs e)
 2


    当然,如果您觉得还是以前的.net datagrid 使用方便,这个控件也是兼容的。

    上面的改进只是为了少写代码,是一种“偷懒”的行径。而下面的代码就是在microsoft datagrid基础上的订制
改进了。


    1.因为分样的方式要与论坛前台的"分页样式"相类似,所以要在分页页码位置之后添加诸如: 当前页码,总页数,
总记录数,跳转到指定页面文本框等,所以下面的代码被开发出来。

      

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]public void DataGrid_ItemCreated(Object sender, DataGridItemEventArgs e)
 2

    2. 相信用过.net datagrid 的用户对下面代码的用法会比较熟悉:
             (控件名).PagerStyle.Mode=PagerMode.NumericPages;

    其实在一开始使用这种分类样式时,还觉得不错,但时间一长,数据一多起来就会在“上一页”和“下一页”
的显示位置上出现"..."这样的链接,我问过许多用户,他们中不少人一开始都搞不清“...”都底是什么东西。于
是我就想把这个表示“上一页”或“下一页”的符号用真正的汉字进行替换。所以就在这个控件中出现了下面的代
码段了(接上面代码段):
     

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]    
 2Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码] //上面的代码段 
 3Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码] TableCell pager = (TableCell)e.Item.Controls[0];
 4Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]
 5Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]        for (int i = 1; i < pager.Controls.Count; i += 2)
 6

        
   3.为了减少因为使用控件而生成过多冗长的viewstate代码,添加了如下的属性:
        

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码][Bindable(true), Category("Appearance"), DefaultValue("")]
 2Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]        public bool SaveDSViewState
 3

     通过上面的属性设置来判断是否EnableViewState,如下:
        

1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]if (!this.SaveDSViewState)
2

  
    4.为了让多行编辑记录并提交更方便,还添加了IsFixConlumnControls属性,当它的值为TRUE时,则当前分页下的
所有记录都以文本框的形式进行显示,也就是在文章一开始的效果图2 中显示的效果(里面的下拉列表框和复选框除外)。
而相应实现代码如下所示:

   

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码] public void DataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
 2

      同时为便于得到指定行的控件的属性值,还添加了下面两个方法:
      

1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]//得到指定行的控件字段的值
2Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]      public string GetControlValue(int controlnumber, string fieldname)
3


      

 1Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]//得到指定行的CheckBox控件字段的值
 2Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]      public bool GetCheckBoxValue(int controlnumber, string fieldname)
 3

    
    当然为了设置和使用的方便和提高开发效率,还有一些属性和方法要么被重写(如DataSource等),要么被添加了进来
(如TableHeaderName等)。大家可以详细看一下包中的源码即可, 这里就不再多说了:)


说句心里话:

    对于这个控件,从公司产品开发的角度来说,基本上满足需要了:)

    但从我个人角度来看却不那么让人满意,原因就是看到了Component Art 里面的Datagrid源码(当然它里面的其它控
件也同样优秀),让我感到“无地自容”。甚至相当长的一段时间里我都不想(或者说不敢)再写任何东西,因为写出来的代
码和功能跟人家的东西一对比,就感到自己写的就是“垃圾”。这段时间大约持约了一个多月。相信园子里的朋友中有些人会
有类以的经历吧!

    但过后慢慢自信心就恢复了过来,因为如果放弃不写代码,水平就会停止下来,而以前所积攒的问题也永远得不到解决,
所以还是逆着头皮“上路”了。现在回过头来看,一年前的这种心态真是很害人,我甚至想起以前温瑞安的一本武侠小说时中
的人物,那位大侠自出师以来就是每战必败,江湖人称“逢打必败”冯无极(具体名字记不清了)。人家在那种情况下居然都
能无所谓,而自己这些年来自认成熟了不少,但还有这种心理,现在回想起来实在是可笑。

  
    好了,主要是东西就先交待到这里了。如果大家有什么问题或建议,欢迎与我交流。
    我的邮件是daizhj@discuz.com, daizhj617595@126.com
  
    
   关键字: .net, 控件, datagrid, component art, control, discuz, discuz!nt, discuznt, 代震军, daizhj
 
   下载链接:/Files/daizhj/datagrid_Controls_Test.rar

 


 

相关文章:

  • 2021-07-15
  • 2021-12-04
  • 2021-06-16
  • 2022-12-23
  • 2021-11-03
  • 2021-06-19
  • 2022-01-23
猜你喜欢
  • 2021-12-21
  • 2021-11-29
  • 2021-08-21
  • 2021-08-18
  • 2021-08-25
  • 2022-01-26
相关资源
相似解决方案