sherwinzhu

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  8 随笔 :: 0 文章 :: 43 评论 :: 14 Trackbacks

重写GridView

效果

 

使用中遇到的问题:

1.         不便于使用CSS控制样式,特别是border-collapse: separate属性总是在border=0时自动出现。

2.         分页样式过于单调,喜欢aspnetPager的样式,也就是用一个DropDownList

3.         DataSourcenull的时候,虽然可以显示EmptyDataTextEmptyDataTemplate,但不显示Header

 

解决方法:

1.         使用WebControlAdapter重写GridView的输出。

2.         重写CreateChildControls方法,生成自定义的PagerRow

3.      重写CreateChildControls方法,即使没有数据,也生成HeaderFooter;同时使用WebControlAdapter重写输出。

 

细节:

1.         如何使用WebControlAdapter重写GridView的输出。

这个问题大家可以参考微软的CssAdapters,我稍微修改了一下,添加了对AutoGenerateColumns==true的情况的考虑。详细就不多说了,具体见Demo的代码。

生成的Html代码好多了。

<table cellspacing="0" summary="">

    <thead>

       <tr class="headRow">

           <th class="listNo" scope="col">No.</th>

           <th class="name" scope="col">名称</th>

           <th class="desc" scope="col">描述</th>

           <th class="listOp" scope="col"> </th>

       </tr>

    </thead>

    <tbody>

       <tr class="row">

           <td class="listNo">1</td>

           <td class="name">角色0</td>

           <td class="desc">角色0备注</td>

           <td class="listOp"><a id="GvRole_ctl02_HLEdit" title="编辑" class="opEdit" href="#"><img title="编辑" src="App_Themes/Default/opEdit.gif" style="border-width:0px;" /></a><input type="image" name="GvRole$ctl02$IBtnDelete" id="GvRole_ctl02_IBtnDelete" title="删除" class="opDel" src="App_Themes/Default/opDel.gif" alt="删除" style="border-width:0px;" /></td>

       </tr>

       <tr class="alternatingRow">

           <td class="listNo">2</td>

           <td class="name">角色1</td>

           <td class="desc">角色1备注</td>

           <td class="listOp"><a id="GvRole_ctl03_HLEdit" title="编辑" class="opEdit" href="#"><img title="编辑" src="App_Themes/Default/opEdit.gif" style="border-width:0px;" /></a><input type="image" name="GvRole$ctl03$IBtnDelete" id="GvRole_ctl03_IBtnDelete" title="删除" class="opDel" src="App_Themes/Default/opDel.gif" alt="删除" style="border-width:0px;" /></td>

       </tr>

       ............................

       <tr class="alternatingRow">

           <td class="listNo">10</td>

           <td class="name">角色9</td>

           <td class="desc">角色9备注</td>

           <td class="listOp"><a id="GvRole_ctl11_HLEdit" title="编辑" class="opEdit" href="#"><img title="编辑" src="App_Themes/Default/opEdit.gif" style="border-width:0px;" /></a><input type="image" name="GvRole$ctl11$IBtnDelete" id="GvRole_ctl11_IBtnDelete" title="删除" class="opDel" src="App_Themes/Default/opDel.gif" alt="删除" style="border-width:0px;" /></td>

       </tr>

    </tbody>

</table>

<div class="pagination bottom"><div class="hint">

    30个记录&nbsp;&nbsp;1&nbsp;/&nbsp;3&nbsp;</div><div class="op">

    <a href="javascript:__doPostBack('GvRole','Page$Next')">下一页</a>

    <a href="javascript:__doPostBack('GvRole','Page$Last')">尾页</a>

    <span>跳转到:</span>

    <select name="GvRole$ctl13$PageList" onchange="javascript:setTimeout('__doPostBack(\'GvRole$ctl13$PageList\',\'\')', 0)" id="GvRole_ctl13_PageList">

       <option selected="selected" value="0">1</option>

       <option value="1">2</option>

       <option value="2">3</option></select></div>

</div>

2.         如何实现自定义分页

CreateChildControls方法中,清除PagerRow中的Controls,添加自己需要的Controls。别的不多说,关键是DropDownList的事件如何处理。我的办法是利用反射,调用GridViewHandleEvent方法处理翻页事件。(虽然不太好,只怪HandleEventprivate的)

private void PageList_Click(Object sender, EventArgs e)

{

int i = int.Parse(((DropDownList)sender).SelectedValue);

 

GridViewCommandEventArgs gce = new GridViewCommandEventArgs(sender, new CommandEventArgs("Page", (i+1).ToString()));

 

MethodInfo method = typeof(System.Web.UI.WebControls.GridView).GetMethod("HandleEvent", BindingFlags.NonPublic | BindingFlags.Instance);

if (method != null)

{

object[] args = new object[3];

args[0] = gce;

args[1] = false;

args[2] = String.Empty;

method.Invoke(this, args);

}

}

3.         如何在DataSourcenull显示HeaderFooter

这个稍微复杂一点,但也不困难。在CreateChildControls方法中,不论是否有数据,初始化HeaderRowFooterRow,然后用反射,设置其中的Cell,最后添加到Table中。

DataControlField[] fieldArray = this.Fields;

if (fieldArray != null && fieldArray.Length > 0)

{

if (this.ShowHeader && (this.HeaderRow == null || addHeaderAndFooter) && this.ShowHeaderAlways)

{

GridViewRow headerRow = null;

GridViewRowEventArgs args;

if (this.HeaderRow == null)

{

headerRow = this.CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);

this.InitializeRow(headerRow, fieldArray);

 

FieldInfo field = typeof(System.Web.UI.WebControls.GridView).GetField("_headerRow", BindingFlags.NonPublic | BindingFlags.Instance);

if (field != null)

{

field.SetValue(this, headerRow);

}

                            ((Table)this.Controls[0]).Rows.Add(headerRow);

 

this.addHeaderAndFooter = true;

}

else

{

headerRow = this.HeaderRow;

}

args = new GridViewRowEventArgs(headerRow);

 

this.OnRowCreated(args);

 

if (dataBinding)

{

headerRow.DataBind();

this.OnRowDataBound(args);

headerRow.DataItem = null;

}

}

}

 

其它

posted on 2006-11-29 03:00 sherwinzhu 阅读(3054) 评论(33)  编辑 收藏

评论

#1楼  2006-11-29 03:31 暴风雨来临      
think you
  回复  引用  查看    

#2楼  2006-11-29 03:57 Go_Rush      
你们都不睡觉的啊,我先睡了,明天再来捧你的场
  回复  引用  查看    

#3楼  2006-11-29 08:56 数据绑定者      
支持,有没有整个工程的下载啊?呵呵


  回复  引用  查看    

#4楼  2006-11-29 13:47 heweitykc [未注册用户]
楼主弄个下载啊!先谢谢哦!^_^
  回复  引用    

#5楼  2006-11-30 11:58 ξ箫音ξ      
private WebControlAdapterExtender extender = null;
private WebControlAdapterExtender Extender
编译不过去,楼主说明下!
  回复  引用  查看    

@ξ箫音ξ

WebControlAdapterExtender 是ASPNETCssFriendlyAdapters 中的一个类,你安装一下ASPNETCssFriendlyAdapters试试。

@数据绑定者
等一下我放一个代码的下载。
  回复  引用    

#7楼  2006-11-30 22:09 高海东      
不错 学习
  回复  引用  查看    

#8楼  2006-12-03 21:01 高海东      
重写GridView
  回复  引用  查看    

3q

對岸的朋友也來copy一下
  回复  引用    

#10楼  2006-12-05 00:20 大剑师      
很不错,有启发
  回复  引用  查看    

#11楼  2006-12-31 10:51 ZX [未注册用户]
弄个下载好吗?
  回复  引用    

#12楼  2007-01-24 09:45 wgm [未注册用户]
能不能讲清楚一点,或者给个下载好吗?
  回复  引用    

#13楼  2007-02-06 11:59 rogerTai [未注册用户]
thank you
  回复  引用    

#14楼  2007-03-14 14:37 adppl      
现在还有代码么,只看这个还是不清楚如何实现的啊
  回复  引用  查看    

#15楼  2007-04-11 14:56 fallstar [未注册用户]
楼主能不能发一个demo给我啊,我现在正在学习这个
我的邮箱:yyilin@163.com
  回复  引用    

#16楼  2007-07-07 00:33 ranl [未注册用户]
楼主 搞个下载地址咯,谢谢了。。
  回复  引用    

#17楼  2007-08-16 10:02 wgmhx [未注册用户]
不错,支持你!能提供源码吗?wgmhx@hotmail.com
  回复  引用    

#18楼  2007-10-09 11:37 Sunlight      
给个源码把!!急用!!
  回复  引用  查看    

#19楼  2007-11-15 16:57 HOH      
希望能提供一份源码 hoh728@163.com
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-12-16 00:01 编辑过