100分助,关于扩展GridView的问题
最近需要用到GridView的一些扩展功能,在网上搜了一圈,找到一个比较合适的,但是从来没自己扩展过控件,尝试了好久,结果还是不对,只好请大家帮忙了
我参考的博客
http://www.cnblogs.com/jillzhang/category/96309.html
我主要是想要排序,Excel和Word导出,个性分页这几个功能
说下我按文章扩展排序功能的过程,新建了一个Web控件库,名称为MyGridView,进去后把WebCustomControl1.cs改为GridViewEx.cs,添加引用System.Data和System.Xml,加入代码,如1楼所示,然后生成MyGridView.dll
引用,在工具箱上选择项,加入生成的MyGridView.dll,然后拖到页面上,后台得到数据源ds,用BindData();方法绑定
这一过程没有报错,数据源有数据,但是调试GridView就是不出来,烦请大家看看,是哪里做错了
或者有更好的扩展GridView文章或控件给介绍一下,但请保证确实可用,谢谢!
------解决方案--------------------1. 注释掉
//protected override void RenderContents(HtmlTextWriter output)
//{
// output.Write(Text);
//}
复合控件,请不要随便重写 RenderContents 方法!!!
2. 调用
GridView1.DataSetSource = MyDataSet;
GridView1.Bind += delegate { };
3.
说实在这个扩展思路,有点混淆 ....
------解决方案--------------------1。
我不知道,你加上这句没有?(绑定事件处理程序)
GridView1.Bind += delegate { };
2。
重新生成dll之后,仍是不显示数据,后来按作者的,在
<cc1:gridviewex id= "GridViewEx1 " runat= "server " AllowSorting= "True " >
这里加了OnBind= "BindData " 之后,可以正常显示数据,并能进行排序了
=========
你这里的 OnBind= "BindData " 是【页面声明】方式绑定事件,同 1 中我的方式是一样的。
3。为什么需要 1 或者 2?
你看到
public virtual void OnBind()
{
if (Bind != null)
// ...
没有,
假如 Bind != null 即事件委托为空,则不执行绑定了。
个人觉得,不知道这有何用意,假如他希望 bind == null 不能执行绑定(即设计者认为此时当前“对象状态”无法执行目标操作),他应该给出处理方案,比如丢出一个异常,避免给类的消费者带来【疑惑】
> > >
public virtual void OnBind()
{
if (Bind == null) throw new InvalidOperationException( "未为 'Bind ' 事件提供处理程序,无法执行绑定。 ");
------解决方案--------------------4。
但又有一个新问题,就是这样做之后,页面一加载数据就显示出来了,我想在点击某一按钮之
后,才显示数据的,请问该怎么做
===========
此问题,主要由于他在 GridViewEx 的 OnLoad 中执行默认的数据绑定,
首先,去掉此方法的重载
protected override void OnLoad(EventArgs e)
{
if (!Page.IsPostBack)
// ....
}
然后,
.... Button1_Click(....
{
GridViewEx1.DataSetSource = MyDataSet;
GridViewEx1.Bind += delegate { }; // 匿名方法
GridViewEx1.OnBind();
}
5。
从 4 引出的另一个问题是,由于原设计重载了 Onload 方法,做了【专有】工作,此 GridViewEx 已无【通用性】而言,只能说特定于某个需求了 .....
6。
BTW, 2 中出现的 OnBind 【属性】与 GridViewEx 中实现的 OnBind() 【方法】是两个完全不一样的东东!!!!
7。
组件开发不容易,需要丰富的实践经验,特别是目标用户的深刻需求分析!
想当然的设计,带来的是组件消费者的【无可奈何】!
8。
Hope helpful.