Asp.net源码交流论坛 Asp.net交流讨论区Asp.ne技术问答转:手把手教你如何扩展GridView之自动排序篇

1  /  1  页    1  跳转
发表新主题 回复该主题

标题: 转:手把手教你如何扩展GridView之自动排序篇

本主题由 部门经理 一半情弧 于 2007-6-13 19:52:02 执行 设置高亮 操作

身份:董事长

 
  • UID:2
  • 来自:北京
  • 精华:27
  • 积分:1622
  • 帖子:1433
  • 注册: 2007-05-17
  • 状态: 离线
  • 威望:54.00
  • 金钱:261.25 元
 
源码发布专家

转:手把手教你如何扩展GridView之自动排序篇

摘自:http://www.cnblogs.com/jillzhang    http://bbs.51aspx.com

  首先说说本文要实现的目的,大家都知道GridView支持排序,但是每次排序的时候,都需要给GridView添加OnSorting事件,这么繁琐而费力,作为世界上最最聪明的程序员的我们难道没有抱怨么?废话少说,不才想到了一种解决这个问题的方法,可以让大家一劳永逸。下面就让兄弟我臭摆一下,希望园子里面的高高手,大大牛们给给面子,捧捧场,别取消兄弟。
  首先创建一个GridViewEx的类,并继承GridView,然后添加如下委托
public delegate void BindEventHandler();
在GridViewEx中添加如下代码:
DataSet _ds;

        [Description("自定义的DataSet类型数据源"),Category("扩展")]
        public virtual DataSet DataSetSource
        {
            get
            {
                return _ds;
            }
            set
            {
                _ds = value;
            }
        }


我们在使用GridViewEx的时候,就只需要设定DataSetSource属性,这个将限定本扩展组件只支持DataSet类型的数据源,其他类型数据源有兴趣的,大家可以进行扩展,象ArrayList,List<>这些都是可以的。
接下来的工作是为GridViewEx添加OnBind事件,如下:


public event BindEventHandler Bind;
        public virtual void OnBind()
        {
            if (Bind != null)
            {
                Bind();
                if (DataSetSource != null)
                {
                    DataView dv = DataSetSource.Tables[0].DefaultView;
                    dv.Sort = SortExpressionStr;                 
                    this.DataSource = dv;
                    this.DataBind();                }
            }
        }


有了这个事件,我们就可以让GridView去类外部获取数据源,然后回到类本身来组织数据和进行绑定了。
接下来,需要声明两个方法

  [Description(&quot;排序表达式&quot;),Category(&quot;扩展&quot;)]
        protected virtual string SortExpressionStr
        {
            get
            {
                if (ViewState[&quot;SortExpression&quot;] == null)
                {
                    return null;
                }
                return ViewState[&quot;SortExpression&quot;].ToString();
            }
            set
            {
                ViewState[&quot;SortExpression&quot;] = value;
            }
        }
        [Description(&quot;排序方向&quot;),Category(&quot;扩展&quot;)]
        protected virtual string SortDirectionStr
        {
            get
            {
                if (ViewState[&quot;SortDirection&quot;] == null)
                {
                    return &quot;DESC&quot;;
                }
                if (ViewState[&quot;SortDirection&quot;].ToString().ToLower() != &quot;asc&quot; &amp;&amp; ViewState[&quot;SortDirection&quot;].ToString().ToLower() != &quot;desc&quot;)
                {
                    return &quot;DESC&quot;;
                }
                return ViewState[&quot;SortDirection&quot;].ToString();
            }
            set
            {
                ViewState[&quot;SortDirection&quot;] = value;
            }
        }


和下面的属性

public string SortExpressionEx
        {
            get
            {
                if (ViewState[&quot;SortExpressionEx&quot;] == null)
                {
                    return null;
                }
                return ViewState[&quot;SortExpressionEx&quot;].ToString();
            }
            set
            {
                ViewState[&quot;SortExpressionEx&quot;] = value;
            }
        }


然后重写OnSorting事件如下:

  protected override void OnSorting(GridViewSortEventArgs e)
        {
            SortExpressionEx = e.SortExpression;
            SortExpressionStr = e.SortExpression + &quot; &quot; + SortDirectionStr;
            OnBind();
            if (SortDirectionStr.ToLower() == &quot;asc&quot;)
            {
                SortDirectionStr = &quot;DESC&quot;;
            }
            else
            {
                SortDirectionStr = &quot;ASC&quot;;
            }
        }


并且增加如下的OnLoad事件


protected override void OnLoad(EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                try
                {
                    OnBind();
                }
                catch
                {
                }
            }
            base.OnLoad(e);
        }


经过上面这样简单的改造,您再次使用GridViewEx的时候,在前台页面使用的时候,您只要按照这样的格式就可以了:
<cc1:GridViewEx id="gridViewEx1"  runat="server" AllowSorting="True">
  <Columns>
    <asp:TemplateField HeaderText="序号" SortExpression="ID"><%#Eval(''ID")%></asp:TemplateField>
</Columns>
</cc1:GridViewEx>
后台只需要添加这样的方法

public void BindData()
{
  DataSet ds = new DataSet();
  ds = //获得DataSet;
  gridView1.DataSetSource = ds;
}


在页面中的Page_Load方法中,也不用再写

if(!Page.IsPostBack)
{
        BindData();//绑定GridView的方法
}


注意,如果需要重新绑定GridView,只需要这样GridViewEx1.OnBind();即可·KyÑìjóSËbbs.51aspx.comià# äÙB
51aspx 最后编辑于 2007-11-29 18:56:05
 
技术问题请直接发布到论坛
问题搜索请点击
引用 回复
 

身份:学员

 
  • UID:3476
  • 来自:西安
  • 精华:0
  • 积分:7
  • 帖子:7
  • 注册: 2007-12-25
  • 状态: 离线
  • 威望:0.00
  • 金钱:0.85 元

回复:转:手把手教你如何扩展GridView之自动排序篇

找不到类型或命名空间名称“Description”(是否缺少 using 指令或程序集引用?)
,怎么会出现这种错误?¬óYFÄuF$(bbs.51aspx.comŽ‚^릂ÿ¾Q
引用 回复
 
1  /  1  页    1  跳转
发表新主题 回复该主题

现在时间是:2008-11-23 23:35:07 京ICP备06046876号