C# 对动态创建的GridView上的特定列禁用SortExpression

C# 对动态创建的GridView上的特定列禁用SortExpression,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个gridView表(使用ASP.NET 3.5),它是使用SqlDataSource对象(从我的SQL DB)填充的,根据不同的授权规则(检索更多/更少的信息)从不同的SELECT命令中动态更改 在GridView中,我设置了AllowSorting=true,它工作得很好 我的问题是: 我想禁用特定列(如照片)的排序,我知道这是通过设置: myGrid.Columns[i].SortExpression = ""; 只是,当我试图访问此特定列时,我得到以下错误: `索引越界(列还不存

我有一个
gridView表(使用ASP.NET 3.5)
,它是使用
SqlDataSource
对象(从我的SQL DB)填充的,根据不同的授权规则(检索更多/更少的信息)从不同的SELECT命令中动态更改

在GridView中,我设置了
AllowSorting=true
,它工作得很好

我的问题是: 我想
禁用特定列(如照片)的排序
,我知道这是通过设置:

myGrid.Columns[i].SortExpression = "";
只是,当我试图访问此特定列时,我得到以下错误: `索引越界(列还不存在!)。

我尝试连接到以下事件:

  • 行数据绑定
  • RowatBinding
但它仍然不起作用。 如何访问特定列(动态创建后)并禁用其排序

这里是一个片段:

ASPX页面:

<asp:GridView ID="gridNew" runat="server" AllowPaging="True" 
    AllowSorting="True" EnableModelValidation="True">
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.

你应该处理这个事件。该文件是可写的

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    // replace with your logic
    String newOrder = "Column1";
    e.SortExpression = newOrder;
    e.SortDirection = "DESC";
}
编辑:如果只想在事件中禁用特定列的排序,通常应将
GridViewColumn
SortExpression
设置为
null

GridView1.Columns[0].SortExpression = null;

但是,您使用的是SqlDataSource(我不熟悉,个人也不喜欢),并且动态创建了
GridView
。GridView的RowCollection也是空的吗?您是否在每次回发时都使用与上次加载页面中相同的ID重新创建动态GridView?

您可以通过禁用GridView数据绑定事件上的单元格来禁用任何列的排序(包括动态)。这将提供禁用列标题显示为按钮的预期结果

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

你好通过执行您的解决方案,并禁用排序逻辑,我实际上并没有禁用列标题作为按钮(“可排序”)显示,只是使其保持可单击状态,而不执行任何操作。你知道我该如何防止它以按钮的形式出现吗?(就像标签一样)。@user1268741:编辑了我的答案。您应该显示动态创建网格的方式和位置。列是使用SqlDataSource对象动态创建的。它工作得很好,我唯一的问题是排序。还有其他解决方案吗\谢谢你,马特,这正是我想要的答案。我从DataTable填充GridView,没有boundfields或templatecolumns。