手把手教你如何扩展GridView之个性分页

最新重构源码下载:打造0代码全自动GridView-天具神力    
整天面对GridView的分页,早就厌烦了,下面就谈下如何给GridView扩展出个性的分页来,首先看看运行效果图:
                        
下面谈下重要的实现的思路的实现代码:
    实现思路和上文的Excel和Word导出是一样的,就是在GridView中添加行,首先声明以下控件,用于显示页次:第几页,共多少页,多少记录,首页,上一页,下一页,尾页

  Label lblCurrentPage;
        Label lblPageCount;
        Label lblRowsCount;
        LinkButton btnFirst;
        LinkButton btnPrev;
        LinkButton btnNext;
        LinkButton btnLast;
在GridView的OnInit方法中,初始化这些控件

 protected override void OnInit(EventArgs e)
        
{
            
this.EnableViewState = true;          

            lblCurrentPage 
= new Label();
            lblCurrentPage.ForeColor 
= ColorTranslator.FromHtml("#e78a29");
            lblCurrentPage.Text 
= "1";

            lblPageCount 
= new Label();
            lblPageCount.Text 
= "1";


            lblRowsCount 
= new Label();
            lblRowsCount.ForeColor 
= ColorTranslator.FromHtml("#e78a29");

            btnFirst 
= new LinkButton();
            btnFirst.Text 
= "首页";
            btnFirst.Command 
+= new CommandEventHandler(NavigateToPage);
            btnFirst.CommandName 
= "Pager";
            btnFirst.CommandArgument 
= "First";

            btnPrev 
= new LinkButton();
            btnPrev.Text 
= "上一页";
            btnPrev.Command 
+= new CommandEventHandler(NavigateToPage);
            btnPrev.CommandName 
= "Pager";
            btnPrev.CommandArgument 
= "Prev";

            btnNext 
= new LinkButton();
            btnNext.Text 
= "下一页";
            btnNext.Command 
+= new CommandEventHandler(NavigateToPage);
            btnNext.CommandName 
= "Pager";
            btnNext.CommandArgument 
= "Next";

            btnLast 
= new LinkButton();
            btnLast.Text 
= "尾页";
            btnLast.Command 
+= new CommandEventHandler(NavigateToPage);
            btnLast.CommandName 
= "Pager";
            btnLast.CommandArgument 
= "Last";

            
base.OnInit(e);
        }


然后是关键部分的代码,就是将这些控件如何添加到GridView中,通过在创建子控件的方式,如下:

   protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
        
{
            
int res = base.CreateChildControls(dataSource, dataBinding);
            
if (ShowToolBar)
            
{
                
try
                
{
                    GridViewRow row 
= new GridViewRow(00, DataControlRowType.Pager, DataControlRowState.Normal);
                    TableCell c 
= new TableCell();
                    c.Width 
= Unit.Percentage(100);
                    c.ColumnSpan 
= this.Columns.Count;                  
                    row.Cells.Add(c);
                    TableCell cell1 
= new TableCell();
                    Table table 
= new Table();
                    TableRow r 
= new TableRow();
                    table.Rows.Add(r);
                    table.Width 
= Unit.Percentage(100);
                    c.Controls.Add(table);
                    r.Cells.Add(cell1);
                    Literal l1 
= new Literal();
                    l1.Text 
= "页次:";
                    cell1.Controls.Add(l1);
                    cell1.Wrap 
= false;
                    cell1.Controls.Add(lblCurrentPage);
                    l1 
= new Literal();
                    l1.Text 
= "页/";
                    cell1.Controls.Add(l1);
                    cell1.Controls.Add(lblPageCount);
                    l1 
= new Literal();
                    l1.Text 
= "页,共";
                    cell1.Controls.Add(l1);
                    cell1.Controls.Add(lblRowsCount);
                    l1 
= new Literal();
                    l1.Text 
= "条记录";
                    cell1.HorizontalAlign 
= HorizontalAlign.Left;
                    cell1.Controls.Add(l1);
                    TableCell cell2 
= new TableCell();
                    cell2.HorizontalAlign 
= HorizontalAlign.Right;
                    cell2.Wrap 
= false;         


                    l1 
= new Literal();
                    l1.Text 
= " [";
                    cell2.Controls.Add(l1);
                    cell2.Controls.Add(btnFirst);
                    l1 
= new Literal();
                    l1.Text 
= "";
                    cell2.Controls.Add(l1);

                    l1 
= new Literal();
                    l1.Text 
= " [";
                    cell2.Controls.Add(l1);
                    cell2.Controls.Add(btnPrev);
                    l1 
= new Literal();
                    l1.Text 
= "";
                    cell2.Controls.Add(l1);

                    l1 
= new Literal();
                    l1.Text 
= " [";
                    cell2.Controls.Add(l1);
                    cell2.Controls.Add(btnNext);
                    l1 
= new Literal();
                    l1.Text 
= "";
                    cell2.Controls.Add(l1);

                    l1 
= new Literal();
                    l1.Text 
= " [";
                    cell2.Controls.Add(l1);
                    cell2.Controls.Add(btnLast);
                    l1 
= new Literal();
                    l1.Text 
= "";
                    cell2.Controls.Add(l1);
                    r.Cells.Add(cell2);
                    
this.Controls[0].Controls.AddAt(0, row);
                }

                
catch
                
{
                }

            }

            
return res;
        }
下面就是处理分页的事件,类似于RowCommand
 public void NavigateToPage(object sender, CommandEventArgs e)
        
{
            btnFirst.Enabled 
= true;
            btnPrev.Enabled 
= true;
            btnNext.Enabled 
= true;
            btnLast.Enabled 
= true;
            
switch (e.CommandArgument.ToString())
            
{
                
case "Prev":
                    
if (this.PageIndex > 0)
                    
{
                        
this.PageIndex -= 1;

                    }

                    
break;
                
case "Next":
                    
if (this.PageIndex < (this.PageCount - 1))
                    
{
                        
this.PageIndex += 1;

                    }

                    
break;
                
case "First":
                    
this.PageIndex = 0;
                    
break;
                
case "Last":
                    
this.PageIndex = this.PageCount - 1;
                    
break;
            }

            
if (this.PageIndex == 0)
            
{
                btnFirst.Enabled 
= false;
                btnPrev.Enabled 
= false;
                
if (this.PageCount == 1)
                
{
                    btnLast.Enabled 
= false;
                    btnNext.Enabled 
= false;
                }

            }

            
else if (this.PageIndex == this.PageCount - 1)
            
{
                btnLast.Enabled 
= false;
                btnNext.Enabled 
= false;
            }

            OnBind();
        }

这样就轻而易举的实现了一个个性的分页,欢迎各位大虾拍砖。
上篇文章地址:
                         手把手教你如何扩展GridView之自带Excel和Word导出 
                         手把手教你如何扩展GridView之自带分页 
                         手把手教你如何扩展GridView之自带CheckBox
                         手把手教你如何扩展GridView之自动排序篇

 

最新重构源码下载:打造0代码全自动GridView-天具神力     
   
在web应用程序中,我们是不是很发愁打印问题,您是不是有过为了打印写Activex的经历,我们有没有想过,Word和Excel的打印功能能被我们利用起来呢?只要我们将我们将数据导出到Excel或者Word中,打印岂不是小case了么。下面就谈谈如何让GridView自己支持导出Excel和Word 。
    首先增加了两个属性,用于指示是否支持Excel导出和Word导出
 

  //增加了一个设置是否显示“导出Word”按钮的属性
        /// <summary>
        
/// 排序提示信息
        
/// </summary>

        [
        Description(
"显示导出到Word"),
        Category(
"扩展"),
         DefaultValue(
true)
        ]
        
public virtual bool ShowExportWord
        
{
            
get
            
{
                
object obj2 = this.ViewState["ShowExportWord"];
                
if (obj2 != null)
                
{
                    
return (bool)obj2;
                }

                
return true;
            }

            
set
            
{
                
bool aShowExportWord = this.ShowExportWord;
                
if (value != aShowExportWord)
                
{
                    
this.ViewState["ShowExportWord"= value;
                    
if (base.Initialized)
                    
{
                        
base.RequiresDataBinding = true;
                    }

                }

            }

        }

        
//增加了一个设置是否显示“导出Excel”按钮的属性
        [
       Description(
"显示导出到Excel"),
       Category(
"扩展"),
       DefaultValue(
true)
       ]
        
public virtual bool ShowExportExcel
        
{
            
get
            
{
                
object obj2 = this.ViewState["ShowExportExcel"];
                
if (obj2 != null)
                
{
                    
return (bool)obj2;
                }

                
return true;
            }

            
set
            
{
                
bool aShowExportExcel = this.ShowExportExcel;
                
if (value != aShowExportExcel)
                
{
                    
this.ViewState["ShowExportExcel"= value;
                    
if (base.Initialized)
                    
{
                        
base.RequiresDataBinding = true;
                    }

                }

            }

        }

声明两个LinkButton控件btnExportWord,btnExport,分别用于点击导出Excel和点击导出word,并在控件的OnInit事件中初始化两个控件


   LinkButton btnExportWord;
        LinkButton btnExport; 
protected override void OnInit(EventArgs e)
        
{
            
this.EnableViewState = true;


            btnExport 
= new LinkButton();
            btnExport.CommandName 
= "ExportToExcel";
            btnExport.EnableViewState 
= true;
            btnExport.Text 
= "导出Excel";

            btnExportWord 
= new LinkButton();
            btnExportWord.CommandName 
= "ExportToWord";
            btnExportWord.EnableViewState 
= true;
            btnExportWord.Text 
= "导出Word";
 
base.OnInit(e);
        }


将两个LinkButton添加到GridView子控件中。

 protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding) {
            
int res = base.CreateChildControls(dataSource, dataBinding);
                
try
                
{
                    GridViewRow row 
= new GridViewRow(00, DataControlRowType.Pager, DataControlRowState.Normal);  TableCell cell2 = new TableCell();
                    cell2.HorizontalAlign 
= HorizontalAlign.Right;
                    cell2.Wrap 
= falseif (this.ShowExportExcel == true)
                    
{
                        l1 
= new Literal();
                        l1.Text 
= " [";
                        cell2.Controls.Add(l1);
                        cell2.Controls.Add(btnExport);
                        l1 
= new Literal();
                        l1.Text 
= "";
                        cell2.Controls.Add(l1);
                    }


                    
if (this.ShowExportWord == true)
                    
{
                        l1 
= new Literal();
                        l1.Text 
= " [";
                        cell2.Controls.Add(l1);
                        cell2.Controls.Add(btnExportWord);
                        l1 
= new Literal();
                        l1.Text 
= "";
                        cell2.Controls.Add(l1);
                    }
 r.Cells.Add(cell2);
                    
this.Controls[0].Controls.AddAt(0, row);
                }

                
catch
                
{
                }

            }

            
return res;
        }

在导出的时候,我们希望一些列不被导出,如修改,删除这样的列,因此我们添加了这样的一个属性


  string _UnExportedColumnNames = "";
        [
  Description(
"不导出的数据列集合,将HeaderText用,隔开"),
  Category(
"扩展"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        PersistenceMode(PersistenceMode.InnerProperty)

  ]
        
public string UnExportedColumnNames
        
{
            
get
            
{
                
return _UnExportedColumnNames;
            }

            
set
            
{
                _UnExportedColumnNames 
= value;
            }

        }

在导出的时候,原来的GridView列表中会有一些LinkButton或者DropDownList控件,导出的时候,我们也希望将其换成纯文本,用下面这个函数可以完成这个目的


 private void DisableControls(Control gv)
        
{

            LinkButton lb 
= new LinkButton();

            Literal l 
= new Literal();

            
string name = String.Empty;

            
for (int i = 0; i < gv.Controls.Count; i++)
            
{

                
if (gv.Controls[i].GetType() == typeof(LinkButton))
                
{

                    l.Text 
= (gv.Controls[i] as LinkButton).Text;

                    gv.Controls.Remove(gv.Controls[i]);

                    gv.Controls.AddAt(i, l);

                }

                
else if (gv.Controls[i].GetType() == typeof(DropDownList))
                
{
                    l.Text 
= (gv.Controls[i] as DropDownList).SelectedItem.Text;

                    gv.Controls.Remove(gv.Controls[i]);

                    gv.Controls.AddAt(i, l);

                }


                
if (gv.Controls[i].HasControls())
                
{
                    DisableControls(gv.Controls[i]);
                }


            }

        }

下面是处理ItemCommand,将GridView导出的代码


  protected override void OnRowCommand(GridViewCommandEventArgs e)
        
{
            
base.OnRowCommand(e);
            
if (e.CommandName == "ExportToExcel")
            
{
                
string[] ss = UnExportedColumnNames.Split(',');
                System.Collections.Generic.List
<string> list = new System.Collections.Generic.List<string>();

                
foreach (string s in ss)
                
{
                    
if (s != ",")
                    
{
                        list.Add(s);
                    }

                }

                ShowToolBar 
= false;
                
this.AllowSorting = false;
                HttpContext.Current.Response.Clear();

                HttpContext.Current.Response.AddHeader(
"content-disposition",
                
"attachment;filename=" + ExcelFileName + ".xls");

                HttpContext.Current.Response.Charset 
= "GB2312";
                HttpContext.Current.Response.ContentEncoding 
= System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
                HttpContext.Current.Response.ContentType = "application/ms-excel";


                System.IO.StringWriter stringWrite 
= new System.IO.StringWriter();

                System.Web.UI.HtmlTextWriter htmlWrite 
=
                
new HtmlTextWriter(stringWrite);

                
bool showCheckAll = ShowCheckAll;
                
this.ShowCheckAll = false;
                
this.AllowPaging = false;
                OnBind();
                DisableControls(
this);
                
foreach (DataControlField c in this.Columns)
                
{
                    
if (list.Contains(c.HeaderText) && !string.IsNullOrEmpty(c.HeaderText))
                    
{
                        c.Visible 
= false;
                    }

                }

                
this.RenderControl(htmlWrite);
                
string content = System.Text.RegularExpressions.Regex.Replace(stringWrite.ToString(), "(<a[^>]+>)|(</a>)""");
                HttpContext.Current.Response.Write(content);

                HttpContext.Current.Response.End();

                
this.AllowPaging = true;
                
this.AllowSorting = true;
                ShowToolBar 
= true;
                
this.ShowCheckAll = showCheckAll;
                OnBind();
            }

            
else if (e.CommandName == "ExportToWord")
            
{
                
string[] ss = UnExportedColumnNames.Split(',');
                System.Collections.Generic.List
<string> list = new System.Collections.Generic.List<string>();

                
foreach (string s in ss)
                
{
                    
if (s != ",")
                    
{
                        list.Add(s);
                    }

                }

                ShowToolBar 
= false;
                
this.AllowSorting = false;
                HttpContext.Current.Response.Clear();

                HttpContext.Current.Response.AddHeader(
"content-disposition",
                
"attachment;filename=" + ExcelFileName + ".doc");

                HttpContext.Current.Response.Charset 
= "GB2312";
                HttpContext.Current.Response.ContentEncoding 
= System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
                HttpContext.Current.Response.ContentType = "application/ms-word";


                System.IO.StringWriter stringWrite 
= new System.IO.StringWriter();

                System.Web.UI.HtmlTextWriter htmlWrite 
=
                
new HtmlTextWriter(stringWrite);

                
bool showCheckAll = ShowCheckAll;
                
this.ShowCheckAll = false;
                
this.AllowPaging = false;
                OnBind();

                DisableControls(
this);
                
foreach (DataControlField c in this.Columns)
                
{
                    
if (list.Contains(c.HeaderText) && !string.IsNullOrEmpty(c.HeaderText))
                    
{
                        c.Visible 
= false;
                    }

                }

                
this.RenderControl(htmlWrite);
                
string content = System.Text.RegularExpressions.Regex.Replace(stringWrite.ToString(), "(<a[^>]+>)|(</a>)""");
                HttpContext.Current.Response.Write(content);

                HttpContext.Current.Response.End();

                
this.AllowPaging = true;
                
this.AllowSorting = true;
                ShowToolBar 
= true;
                ShowCheckAll 
= showCheckAll;
                OnBind();
            }

        }


使用的时候,只要指定ShowExportExcel=True,ShowExportWord=True就自动出现导出Word和导出Excel的按钮了,点击自动会将GridView中的数据导出到Word或者Excel中了,如果原GridView是多页的,那也会自动将全部数据(而不是当前页的数据)导出,而且会剔除原来数据中的一些超级链接。使用起来相当简单,效果页非常好。
上篇文章地址:
                         手把手教你如何扩展GridView之自带分页 
                         手把手教你如何扩展GridView之自带CheckBox
                         手把手教你如何扩展GridView之自动排序篇

 

 

 

最新重构源码下载:打造0代码全自动GridView-天具神力     
   

   您在使用GridView的时候是不是每次都要处理分页事件OnPageIndexChanging,面对成千上万的页面,您是否在页面中都有这样的代码: this.PageIndex = e.NewPageIndex;,看着原来写的臃肿的页面代码,您高兴的起来么?现在考验程序员水平的标准不再是写过多少行代码了,同志们,而是用最少的代码实现最多的功能。下面谈谈怎么实现一个自己会分页的GridView扩展,进一步实现GridView的自动化。
    首先谈谈实现这个功能的思路,我们在平时无奈的写下 this.PageIndex = e.NewPageIndex;的时候,下面作的事情肯定是获取数据源并绑定GridView,那么在我们的组件中,我们需要在GridView内部通知外部页面,“hi,页面大哥,我现在换页了,给俺个数据源,并给我绑上!”,这个时候,大家第一个反映肯定是利用委托事件了,我们用一个委托来实现去外部获取数据源的目的,声明一个委托:

 

 public delegate void BindEventHandler();

然后在GridView扩展中声明一个实现BindEventHandler的事件

    public event BindEventHandler Bind;
        
public virtual void OnBind()
        
{
            
if (Bind != null)
            
{
                Bind();
                
if (DataSource != null)
                
{
                    
this.DataBind();
                }

            }

        }

然后重写OnPageIndexChanging事件

 protected override void OnPageIndexChanging(GridViewPageEventArgs e)
        
{
            
this.PageIndex = e.NewPageIndex;
            OnBind();
        }


现在对GridView的扩展就完成了,简单吧,使用的时候需要注意的是,GridView必须实现bind事件,就是一定要给OnBind设置一个函数,在这个函数里面可以页面参数(Request.Param)或者控件内容(TextBox1.Text),或者其他条件来获取动态数据,并将得到的数据集合设置为GridView的DataSource,这样GridView就自己会分页了。
上篇文章地址:
                         手把手教你如何扩展GridView之自带CheckBox
                         手把手教你如何扩展GridView之自动排序篇

最新重构源码下载:打造0代码全自动GridView-天具神力     

      我们在使用GridView的时候,很多时候需要使用CheckBox列,比如批量删除,批量审批,但是每每都需要记住繁琐的实现方法。多麻烦呀!再次给GridView做个手术,让它自己就能产生CheckBox岂不爽死了。以后您就有权利忘记怎么实现CheckBox列了。哈哈,作咱们这行的,就要学的慢慢退化,什么事情都记着,累也累死了。
      下面谈谈我这实现的思路:
      因为GridView是基于模板的,Columns也不能在后台添加,所以排除通过添加Column来实现,而采用在GridView创建行的时候动态创建表单元格,在表头行上添加一个全选CheckBox,数据行上添加选择框,点击全选,通过向页面注册的脚本来实现全选。
   下面就看看关键的代码:
    为了增加灵活性,添加了一个属性,控制是否显示CheckBox列  

   //是否显示全选
        [
      Description(
"显示全选列"),
      Category(
"扩展"),
        DefaultValue(
false)
      ]
        
public virtual bool ShowCheckAll
        
{
            
get
            
{
                
object obj2 = this.ViewState["ShowCheckAll"];
                
if (obj2 != null)
                
{
                    
return (bool)obj2;
                }

                
return false;

            }

            
set
            
{
                
bool aShowCheckAll = this.ShowCheckAll;
                
if (value != aShowCheckAll)
                
{
                    
this.ViewState["ShowCheckAll"= value;
                    
if (base.Initialized)
                    
{
                        
base.RequiresDataBinding = true;
                    }

                }

            }

        }

用于控制选择列是添加到表的左端还是右端的属性

 public enum CheckColumnAlign
    
{
        Left, Right
    }


   
//是否显示全选
        [
      Description(
"全选列的位置"),
      Category(
"扩展"),
      DefaultValue(CheckColumnAlign.Left)
      ]
        
public virtual CheckColumnAlign CheckColumnAlign
        
{
            
get
            
{
                
object obj2 = this.ViewState["CheckColumnAlign"];
                
if (obj2 != null)
                
{
                    
return (CheckColumnAlign)obj2;
                }

                
return CheckColumnAlign.Left;
            }

            
set
            
{
                CheckColumnAlign aCheckColumnAlign 
= this.CheckColumnAlign;
                
if (value != aCheckColumnAlign)
                
{
                    
this.ViewState["CheckColumnAlign"= value;
                    
if (base.Initialized)
                    
{
                        
base.RequiresDataBinding = true;
                    }

                }

            }

        }

在页面加载的时候,注册全选脚本

 StringBuilder sb = new StringBuilder();
            sb.Append(
" <script type=\"text/javascript\">");
            sb.Append(
"function CheckAll(oCheckbox)");
            sb.Append(
"{");
            sb.Append(
"var GridView2 = document.getElementById(\"" + this.ClientID + "\");");
            sb.Append(
" for(i = 1;i < GridView2.rows.length; i++)");
            sb.Append(
"{");
            sb.Append(
"var inputArray = GridView2.rows[i].getElementsByTagName(\"INPUT\");");
            sb.Append(
"for(var j=0;j<inputArray.length;j++)");
            sb.Append(
"{ if(inputArray[j].type=='checkbox')");
            sb.Append(
"{if(inputArray[j].id.indexOf('ItemCheckBox',0)>-1){inputArray[j].checked =oCheckbox.checked; }}  }");
            sb.Append(
"}");
            sb.Append(
" }");
            sb.Append(
"</script>");
            ScriptManager.RegisterClientScriptBlock(
thisthis.GetType(), "CheckFun", sb.ToString(), false);

在GridView的RowCreate事件中,添加如下代码,用于创建CheckBox列

   if (ShowCheckAll)
                
{
                    GridViewRow row 
= e.Row;
                    
if (row.RowType == DataControlRowType.Header)
                    
{
                        TableCell cell 
= new TableCell();
                        cell.Wrap 
= Wrap;
                        cell.Width 
= Unit.Pixel(50);
                        cell.Text 
= " <input id='Checkbox2' type='checkbox' onclick='CheckAll(this)'/><label>全选</label>";
                        
if (CheckColumnAlign == CheckColumnAlign.Left)
                        
{
                            row.Cells.AddAt(
0, cell);
                        }

                        
else
                        
{
                            
int index = row.Cells.Count;
                            row.Cells.AddAt(index, cell);
                        }

                    }

                    
else if (row.RowType == DataControlRowType.DataRow)
                    
{
                        TableCell cell 
= new TableCell();
                        cell.Wrap 
= Wrap;
                        CheckBox cb 
= new CheckBox();
                        cell.Width 
= Unit.Pixel(50);
                        cb.ID 
= "ItemCheckBox";
                        cell.Controls.Add(cb);
                        
if (CheckColumnAlign == CheckColumnAlign.Left)
                        
{
                            row.Cells.AddAt(
0, cell);
                        }

                        
else
                        
{
                            
int index = row.Cells.Count;
                            row.Cells.AddAt(index, cell);
                        }

                    }

                }

用于记录CheckBox的ID的属性

 public string CheckBoxID
        
{
            
get
            
{
                
return "ItemCheckBox";
            }

        }

使用的时候,只需要设置扩展GridView的ShowCheckAll=True,设置CheckColumnAlign为Left,CheckBox列在最左边,Right在最右面,注意因为没有添加Columns,所以Columns并没有因为因为添加了CheckBox列而变化,在Column的索引中,CheckBox列不在计算范围。
在扩展的GridView的OnRowDataBound事件中,就可以通过
CheckBox cb = e.Row.FindControl(gridView.CheckBoxID) as CheckBox;
if(cb!=null)

    if(cb.Checked)
   {
        //...
   }
}
来获取是否已经选中此行。
上篇文章:手把手教你如何扩展GridView之自动排序篇

最新重构源码下载:打造0代码全自动GridView-天具神力     
      
看到这两天园子里面“强奸”GridView的兄弟们可真不少,自己也手痒,也凑凑热闹,写得好,大家鼓励鼓励,写的不好,大家多多指教。
   首先说说本文要实现的目的,大家都知道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("排序表达式"),Category("扩展")]
        
protected virtual string SortExpressionStr
        
{
            
get
            
{
                
if (ViewState["SortExpression"== null)
                
{
                    
return null;
                }

                
return ViewState["SortExpression"].ToString();
            }

            
set
            
{
                ViewState[
"SortExpression"= value;
            }

        }

        [Description(
"排序方向"),Category("扩展")]
        
protected virtual string SortDirectionStr
        
{
            
get
            
{
                
if (ViewState["SortDirection"== null)
                
{
                    
return "DESC";
                }

                
if (ViewState["SortDirection"].ToString().ToLower() != "asc" && ViewState["SortDirection"].ToString().ToLower() != "desc")
                
{
                    
return "DESC";
                }

                
return ViewState["SortDirection"].ToString();
            }

            
set
            
{
                ViewState[
"SortDirection"= value;
            }

        }

 

和下面的属性

 

 public string SortExpressionEx
        
{
            
get
            
{
                
if (ViewState["SortExpressionEx"== null)
                
{
                    
return null;
                }

                
return ViewState["SortExpressionEx"].ToString();
            }

            
set
            
{
                ViewState[
"SortExpressionEx"= value;
            }

        }

 

然后重写OnSorting事件如下:

 

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

            
else
            
{
                SortDirectionStr 
= "ASC";
            }

        }

 

并且增加如下的OnLoad事件

 

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

                
catch
                
{

                }

            }

            
base.OnLoad(e);
        }

 


经过上面这样简单的改造,您再次使用GridViewEx的时候,在前台页面使用的时候,您只要按照这样的格式就可以了:
<cc1:GridViewEx id="gridViewEx1" OnBind="BindData" 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();即可。

posted on 2008-09-27 09:30  seaven  阅读(847)  评论(0)    收藏  举报

导航