【问题标题】:Disable SortExpression for specific Column on a Dynamically created GridView为动态创建的 GridView 上的特定列禁用 SortExpression
【发布时间】:2012-03-14 10:56:28
【问题描述】:

我有一个gridView table (using ASP.NET 3.5),它使用SqlDataSource 对象(来自我的SQL DB)填充,根据不同的授权规则(检索到更多/更少的信息),它从不同的SELECT 命令动态变化。

在 GridView 中,我设置了 AllowSorting=true,它运行良好。

我的问题是: 我想disable Sorting 获取特定列(例如照片),我知道这是通过设置完成的:

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

仅当我尝试访问此特定列时,我收到以下错误: `Index Out Of Bound(列还不存在!)。

我尝试连接到以下事件:

  • 行数据绑定
  • Rowata 绑定

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

这里是片段:

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;
        }

谢谢! :) 米西。

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    您可以通过在 GridView DataBound 事件上禁用单元格来禁用对任何列(包括动态)的排序。这将给出禁用列标题显示为按钮的预期结果。

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

    【讨论】:

    • 谢谢马特,这正是我正在寻找的答案。我从 DataTable 填充 GridView 并且没有边界字段或模板列。
    【解决方案2】:

    您应该处理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";
    }
    

    编辑:如果您只想禁用事件中特定列的排序,通常应该将GridViewColumnSortExpression设置为null

    GridView1.Columns[0].SortExpression = null;
    

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

    【讨论】:

    • 嗨!通过执行您的解决方案并禁用排序逻辑,我实际上并没有禁用列的标题显示为按钮(“可排序”),只是导致它保持可点击状态,但什么也不做。知道如何才能真正防止它显示为按钮吗? (就像一个标签)。
    • @user1268741:编辑了我的答案。您应该展示动态创建网格的方式和位置。
    • 列是使用 SqlDataSource 对象动态创建的。它工作得很好,我唯一的问题是排序。还有其他解决方案吗? :\
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多