繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> Asp.Net开发 >> 重写GridView

重写GridView

2007-10-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:重写GridView 效果 使用中遇到的问题: 1. 不便于使用CSS控制样式,特别是border-collapse: separate属性总是在border=0时自动出现。 2. 分页样式过于单调,喜欢ASPnetPager的样式,也就是用一个...
关键字:GridView

重写GridView

效果

使用中遇到的问题:

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

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

3. 当DataSource为null的时候,虽然可以显示EmptyDataText或EmptyDataTemplate,但不显示Header。

解决方法:

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

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

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

细节:

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

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

生成的HTML代码好多了。

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

No. 名称 描述
1 角色0 角色0备注
2 角色1 角色1备注
10 角色9 角色9备注

2. 如何实现自定义分页

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

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. 如何在DataSource为null显示Header或Footer

这个稍微复杂一点,但也不困难。在CreateChildControls方法中,不论是否有数据,初始化HeaderRow或FooterRow,然后用反射,设置其中的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;

}

}

}

其它…

代码:/Files/sherwinzhu/GridViewDemo.zip

责任编辑:admin
相关文章