2012-03-14 40 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