ASP.NET 扩展网格控件

分享于 

18分钟阅读

Web开发

  繁體

介绍

在本文中,我将讨论我的EnhanceGrid,它具有以下功能:

  • 自定义分页只获取所需的记录数目
  • 在列标题中显示排序方向的icon
  • 页导航中的下拉列表以调整页中的记录数
  • 扩展网格的属性
  • 如何使用自定义网格控件

自定义分页只获取所需的记录数目

下面是我用来在定制网格中提供自定义分页功能的存储过程。 注释解释字段并给出有关存储过程的详细信息:

CREATEPROCEDURE [dbo].[GetRequestedRecordByPage] 
 @FromListnvarchar(200) -- Table Name ,@SortingColnvarchar(200) -- Sorting column Name,@SelectListnvarchar(200) = '*'-- Select columns list,@WhereClausenvarchar(200) = ''-- Where clause i.e condition,@PageNumint = 1-- Requested page number,@PageSizeint = 5-- No of record in page,@TotalNoOfRecordintoutput-- Total no of selected recordsASBeginSETNOCOUNTON 
 DECLARE@Querynvarchar(max) -- query going to be executeIF rtrim(ltrim(@WhereClause)) <> '' 
 BEGINSET@Query ='SELECT @TotalNoOfRecord = COUNT(*) 
 FROM ' + @FromList + ' 
 WHERE ' + @WhereClause 
 ENDELSE 
 BEGIN 
 SET@Query ='SELECT @TotalNoOfRecord = COUNT(*) 
 FROM ' + @FromList 
 END/* Count no. of record */EXEC sp_executeSQL 
 @Query, 
 @params = N'@TotalNoOfRecord INT OUTPUT', 
 = @TotalNoOfRecordOUTPUTDECLARE@lboundint, @uboundint/* Calculating upper and lower bound */SET@lbound = ((@PageNum - 1) * @PageSize) 
 SET@ubound = @lbound + @PageSize + 1/* Get list of record(s) */SELECT@Query = ''SELECT@Query = 'SELECT * 
 FROM ( 
SELECT ROW_NUMBER() OVER(ORDER BY ' + @SortingCol + ') AS rownumber,' +@SelectList + 
 ' FROM ' + @FromList 
 IF rtrim(ltrim(@WhereClause)) <> '' 
 BEGINSELECT@Query = @Query + ' WHERE ' + @WhereClause 
 ENDSELECT@Query = @Query + ' ) AS tbl 
WHERE rownumber> ' + CONVERT(varchar(9), @lbound) + 
 ' AND rownumber <' + CONVERT(varchar(9), @ubound) 
 EXEC (@Query) End

可以看到,上面的过程是通用的,因此可以在任何地方使用。 因此,我将它作为EnhanceGrid的一部分包含,因为它适用于任何用 ASP.NET. 开发的项目

在列标题中显示排序方向的icon

为了在标题文本中显示排序 icon,我重写了标准 Grid 控件的以下事件,这些事件是. NET 框架的一部分。

  • OnRowCreated: 创建行时将激发此事件。 如果使用这个选项,那么我将通过获取被单击项的索引添加排序 icon,然后调用 SortingIcon 方法在标题行中添加该 icon。
  • protectedoverridevoid OnRowCreated(GridViewRowEventArgs e)
    {
     if (e.Row.RowType == DataControlRowType.Header)
     {
     /* Get sorting column index */int index = GetSortColumnIndex();
     if (index!= -1)
     {
     sortingIcon(index, e.Row);
     }
     }
    }
  • OnSorting: 当用户单击标题列以排序网格控件的记录时,将调用这里事件。 从下面的代码中可以看到,它将列排序表达式存储在 lblSortExp 中,并在 lblSortDirection 中存储排序方向,并将当前存储的值。
  • protectedoverridevoid OnSorting(GridViewSortEventArgs e)
    {
     try {
     lblSortExp = e.SortExpression;
     switch (lblSortDirection)
     {
     case"asc":
     {
     lblSortDirection = "desc";
     break;
     }
     case"desc":
     case"":
     casenull:
     {
     lblSortDirection = "asc";
     break;
     }
     }
     BindGrid();
     }
     catch (Exception ex) { }
    }
  • SortingIcon: 这里函数用于在列的标题中添加排序图标。 在这个函数中,我创建了一个 Label,它是用单击的标题列中的标题文本动态添加的。
  • privatevoid sortingIcon(int index, GridViewRow row)
    {
     System.Web.UI.WebControls.Label lblSorting = 
     new System.Web.UI.WebControls.Label();
     if (lblSortDirection == "desc")
     {
     lblSorting.Text = "<span style="font-family:" + 
     "Marlett; font-weight:bold">6</span>";
     }
     else {
     lblSorting.Text = "<span style="font-family:Marlett;" + 
     " font-weight:bold">5</span>";
     }
     row.Cells[index].Controls.Add(lblSorting);
    }
  • GetSortColumnIndex: 这里函数用于获取用户对排序所单击的列的索引。 在这里函数中,我将单击列的排序表达式与每个列进行比较,并获取单击列的索引。 这是需要的,因为我不知道被点击列的索引。
  • privateint GetSortColumnIndex()
    {
     foreach (DataControlField field inthis.Columns)
     {
     if (field.SortExpression.ToString() == lblSortExp)
     {
     returnthis.Columns.IndexOf(field);
     }
     }
     return -1;
    }

页导航中的下拉列表以调整每页记录的数目

对于每页记录的数量,我重写了相同的方法,以显示排序 icon,但这里改变了条件。 我检查了页导航类型行,如下所示。 在下面的代码中,我创建了一个下拉控件,其中包含每页记录编号和所附的所选更改。

protectedoverridevoid OnRowCreated(GridViewRowEventArgs e)
{
 try {
 if (e.Row.RowType == DataControlRowType.Pager)
 {
 DropDownList ddl ddlNoPages = new DropDownList();
 //adds variants of pager size ddlNoPages.Items.Add("10");
 ddlNoPages.Items.Add("50");
 ddlNoPages.Items.Add("100");
 ddlNoPages.AutoPostBack = true;
 //selects item due to the GridView current page size ListItem li = ddlNoPages.Items.FindByText(this.PageSize.ToString());
 if (li!= null)
 ddlNoPages.SelectedIndex = ddlNoPages.Items.IndexOf(li);
 ddlNoPages.SelectedIndexChanged += 
 new EventHandler(ddlNoPages _SelectedIndexChanged);
 //adds dropdownlist in the additional cell to the pager table Table pagerTable = e.Row.Cells[0].Controls[0] as Table;
 TableCell cell = new TableCell();
 cell.Style["padding-left"] = "50px";
 cell.Style["text-align"] = "right";
 cell.Controls.Add(new LiteralControl("Page Size:"));
 cell.Controls.Add(ddlNoPages);
 //e.Row.Cells[0].Controls.Add(cell); pagerTable.Rows[0].Cells.Add(cell);
 }
 }
 catch (Exception ex)
 {
 }
}

更改combobox索引时将激发以下事件。 代码很容易理解,所以我认为没有必要详细解释它。

void ddlNoPages_SelectedIndexChanged(object sender, EventArgs e)
{
 if (PageSize >int.Parse(((DropDownList)sender).SelectedValue))
 IsPagesizeChanged = true;
 else IsPagesizeChanged = false;
 PageIndex = 0;
 //changes page size PageSize = int.Parse(((DropDownList)sender).SelectedValue);
 //binds data source BindGrid();
}

在我工作的这个方法中仍然有一些错误,我将为这个方法提供一个完整的解决方案。

完成以上操作之后,你需要重写自定义分页存储过程的以下网格的方法来工作。 在这里方法中,你必须设置分页数据源属性的值。

protectedoverridevoid InitializePager(GridViewRow row, 
 int columnSpan, PagedDataSource pagedDataSource)
{
 try {
 #region code for standard paging//To set custome paging pagedDataSource.AllowCustomPaging = true;
 //To set total no of records retived  pagedDataSource.VirtualCount = Convert.ToInt32(lbltotal);
 //To set current page index pagedDataSource.CurrentPageIndex = lblpageIndex;
 #endregion code for standard paging 
 base.InitializePager(row, columnSpan, pagedDataSource);
 }
 catch (Exception ex) { }
}

你还可以覆盖上述方法,以根据客户需求提供不同种类的自定义分页。

扩展网格的属性

注意,大多数属性都以视图视图的形式获取它们的值,并在ViewState中设置。 通过使用ViewState机制,网格在 postback 事件期间保留属性值。

另一个要注意的是,控制with是附加在每个with属性上,因为如果在一页上删除同一个网格控件。

  • lbltotal: 这里属性用于存储由存储过程检索的记录总数;它用于相应地调整分页。
  • publicint lbltotal
    {
     get {
     if (null!= ViewState["lbltotal" + ControlID])
     return (int)ViewState["lbltotal" + ControlID];
     elsereturn0;
     }
     set {
     ViewState["lbltotal" + ControlID] = value;
     }
    }
  • lblpageIndex: 存储当前页面索引。
  • publicint lblpageIndex
    {
     get {
     if (null!= ViewState["lblpageIndex" + ControlID])
     return (int)ViewState["lblpageIndex" + ControlID];
     elsereturn0;
     }
     set {
     ViewState["lblpageIndex" + ControlID] = value;
     }
    }
  • lblSortDirection: 存储列的排序方向。
  • publicstring lblSortDirection
    {
     get {
     if (null!= ViewState["lblSortDirection" + ControlID])
     return (string)ViewState["lblSortDirection" + ControlID];
     elsereturnstring.Empty;
     }
     set {
     ViewState["lblSortDirection" + ControlID] = value;
     }
    }
  • lblSortExp: 存储排序表达式,换句话说,列排序表达式。
  • publicstring lblSortExp
    {
     get {
     if (null!= ViewState["lblSortExp" + ControlID])
     return (string)ViewState["lblSortExp" + ControlID];
     elsereturnstring.Empty;
     }
     set {
     ViewState["lblSortExp" + ControlID] = value;
     }
    }
  • FromClause: 存储 来自 传递给存储过程以检索记录的查询的子句。
  • publicstring FromClause
    {
     get {
     if (null!= ViewState["fromClause" + ControlID])
     return (string)ViewState["fromClause" + ControlID];
     elsereturnstring.Empty; 
     }
     set {
     ViewState["fromClause" + ControlID] = value;
     }
    }
  • WhereClause: 存储 火警的警铃在哪里? 查询子句,它作为查询的where条件传递给存储过程。
  • publicstring WhereClause
    {
     get {
     if (null!= ViewState["whereClause" + ControlID])
     return (string)ViewState["whereClause" + ControlID];
     elsereturnstring.Empty;
     }
     set {
     ViewState["whereClause" + ControlID] = value;
     }
    }
  • SelectList: 存储将要传递到存储过程的选择列表列名。
  • publicstring SelectList
    {
     get {
     if (null!= ViewState["selectList" + ControlID])
     return (string)ViewState["selectList" + ControlID];
     elsereturnstring.Empty;
     }
     set {
     ViewState["selectList" + ControlID] = value;
     }
    }
  • ControlID: 存储控件的ID。
  • privatestring _controlId;publicstring ControlID
    {
     get { return _controlId; }
     set { _controlId = value; }
    }
  • DefaultSortExp: 存储网格中用于排序的默认排序表达式,直到第一个排序事件发生。
  • privatestring _DefaultSortExp;publicstring DefaultSortExp
    {
     set{ _DefaultSortExp = value;}
     get{ return _DefaultSortExp;}
    }

其他重要事项

下面是允许在页面上使用网格时附加你自己的事件的属性。

publicevent GridViewRowEventHandler onRowCreate
{
 add {
 base.RowCreated += value;
 }
 remove {
 base.RowCreated -= value;
 }
}publicevent GridViewSortEventHandler onSort
{
 add {
 base.Sorting += value;
 }
 remove {
 base.Sorting -= value;
 }
}

如何使用自定义网格控件

下面是 register 网页上的网格控件的代码:

<%@RegisterTagPrefix="cc"Namespace="AppEngine.ComponentControls"Assembly="__code"%>

下面是在ASPX页上使用网格控件的代码:

<cc:MyGridViewrunat="server"ID="grdEmployee"AutoGenerateColumns="False"AllowPaging="true"AllowSorting="true"DefaultSortExp="FIRSTNAME"EnableSortingAndPagingCallbacks="false"><Columns><asp:BoundFieldDataField="FIRSTNAME"HeaderText="FIRSTNAME"SortExpression="FIRSTNAME"/><asp:BoundFieldDataField="LASTNAME"HeaderText="LASTNAME"SortExpression="LASTNAME"/><asp:BoundFieldDataField="LOGINNAME"HeaderText="LOGINNAME"SortExpression="LOGINNAME"/><asp:BoundFieldDataField="EMAIL"HeaderText="EMAIL"SortExpression="EMAIL"/></Columns><PagerSettingsMode="NumericFirstLast"Position="TopAndBottom"PageButtonCount="5"/><PagerStyleBackColor="Pink"/></cc:MyGridView>

下面的代码是你的aspx.cs 文件的一部分。 如以下代码所示,指定了一个列列表,包含表名,这里是雇员,WhereClause 有过滤条件。

protectedvoid Page_Load(object sender, EventArgs e)
{
 if (!IsPostBack)
 {
 grdEmployee.SelectList = "[FIRSTNAME],[LASTNAME],[LOGINNAME],[EMAIL]";
 grdEmployee.FromClause = "[EMPLOYEE]";
 grdEmployee.WhereClause = string.Empty;
 //grdEmployee.WhereClause ="[FIRSTNAME] like '%a'"; grdEmployee.BindGrid();
 }
}

使用网格搜索

下面是在EnhanceGrid控件中搜索数据的示例:

为了查找目的,我在页面上添加了以下控件,放置网格控件有助于搜索记录:

  • ddlColumn: 包含EnhanceGrid控件将要显示的列的名称。 这里要注意的是列表项的值字段,它具有数据库表的列的名称。
  • txtValue: 允许用户输入一个值以搜索特定列的控件。
  • <divstyle="width: 100%;"><divstyle="float: left; width : 10%;"><asp:Labelrunat="server"ID="lblSearch"Text="Select Criteria"></asp:Label></div><divstyle="float: left; width :10%;"><asp:DropDownListrunat="server"ID="ddlColumn"><asp:ListItemText="First Name"Value="FIRSTNAME"></asp:ListItem><asp:ListItemText="Last Name"Value="LASTNAME"></asp:ListItem><asp:ListItemText="Login ID"Value="LOGINNAME"></asp:ListItem><asp:ListItemText="E-mail ID"Value="EMAIL"></asp:ListItem></asp:DropDownList></div><divstyle="float: left; width :10%;"><asp:Labelrunat="server"ID="lblValue"Text="Value"></asp:Label></div><divstyle="float: left; width :15%;"><asp:TextBoxrunat="server"ID="txtValue"></asp:TextBox></div><div><asp:Buttonrunat="server"ID="btnSearch"Text="Search"onclick="btnSearch_Click"/></div></div>
  • btnSearch: 包含用于从数据库中搜索特定数据的代码。 如下面的代码所示,如果存在 txtValue 文本字段中存在的值,它将形成 火警的警铃在哪里? 子句,如果不存在,则传递空 火警的警铃在哪里? 搜索网格控件的所有记录的子句。
  • protectedvoid btnSearch_Click(object sender, EventArgs e)
    {
     if (!string.IsNullOrEmpty(txtValue.Text))
     {
     grdEmployee.WhereClause = ddlColumn.SelectedValue + 
     " like '%" + txtValue.Text + "%'";
     }
     else {
     grdEmployee.WhereClause = string.Empty;
     }
     grdEmployee.SelectList = 
     "[FIRSTNAME],[LASTNAME],[LOGINNAME],[EMAIL]";
     grdEmployee.FromClause = "[EMPLOYEE]";
     grdEmployee.BindGrid(); 
    }

控制  ext  asp  asp-net  GRID  Extend  
相关文章