2012-03-14 86 views
1

我有一个gridView table (using ASP.NET 3.5),它使用来自我的SQL DB的SqlDataSource对象(根据不同的授权规则动态更改)动态变化(更多/更少的信息是检索)。为动态创建的GridView上的特定列禁用SortExpression

在GridView中,我设置了AllowSorting=true,它的工作完美。

我的问题是: 我想disable Sorting特定的列(如照片),我理解它是通过设置来完成:

myGrid.Columns[i].SortExpression = ""; 

只是,当我试图访问这个特定的列,我得到的错误: `索引超出界限(列还不存在!)。

我试图连接到下列事件:

  • 的RowDataBound
  • RowataBinding

,它仍然没有工作。 如何访问特定列(一旦它动态创建)并禁用它的排序?

下面是摘录:

ASPX Page:

<asp:GridView ID="gridNew" runat="server" AllowPaging="True" 
    AllowSorting="True" EnableModelValidation="True"> 

.CS Page:

protected void btnSend_Click(object sender, EventArgs e) 
    { 
     gridNew.DataSourceID = "Employees_DataSource"; 
     switch (ddlSelection.SelectedValue) 
     { 
      case "Admin": 
       Employees_DataSource.SelectCommand = @"SELECT * FROM [Employees]"; 
       gridNew.AutoGenerateDeleteButton = true; 
       gridNew.AutoGenerateEditButton = true; 
       gridNew.DataBind(); 
       //gridNew.Columns[1].SortExpression = ""; 
       // This is not working!! :(
       break; 

      case "Manager": ... 

      default: 
       break; 
     } 

谢谢! :) Mitsy。

回答

1

您应该处理GridView.Sorting事件。 GridViewSortingEventArgs.SortExpression是可写的。

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    // replace with your logic 
    String newOrder = "Column1"; 
    e.SortExpression = newOrder; 
    e.SortDirection = "DESC"; 
} 

编辑:如果你只是想禁用排序为事件的特定列,通常它应该工作设置GridViewColumnSortExpressionnull

GridView1.Columns[0].SortExpression = null; 

但是,正在使用SqlDataSource(我不熟悉并且亲自避免)您已经动态创建了GridView。 GridView的RowCollection也是空的吗?您是否在最新的Page_Load中每次回发时都使用与以前相同的ID重新创建动态GridView?

+0

嗨!通过做您的解决方案,并禁用排序逻辑,我真的不*禁用*列标题出现一个按钮(“排序”),只有使其保持点击,但什么都不做。任何想法如何我实际上可以防止它出现作为一个按钮? (如标签)。 – user1268741 2012-03-14 12:30:22

+0

@ user1268741:编辑我的答案。您应该显示动态创建网格的方式和位置。 – 2012-03-14 12:48:31

+0

这些列是使用SqlDataSource对象动态创建的。它完美的工作,我唯一的问题是与排序。其他解决方案? :\ – user1268741 2012-03-14 14:13:52

2

通过禁用GridView DataBound事件上的单元格,可以禁用任何列上的排序(包括动态)。这将使希望禁用列标题的结果显示为按钮。

protected void yourgrid_DataBound(object sender, EventArgs e) 
{ 
    yourgrid.HeaderRow.Cells[4].Enabled = false; 
    yourgrid.HeaderRow.Cells[5].Enabled = false; 
} 
+0

谢谢马特这只是我正在寻找的答案。我从DataTable填充GridView并且没有绑定字段或模板列。 – Doreen 2017-05-04 19:00:14