在动态创建的GridView上禁用特定列的SortExpression

时间:2012-03-14 10:56:28

标签: c# asp.net gridview

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

在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。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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";
}

修改:如果您只想禁用事件中特定列的排序,通常应该将GridViewColumn的{​​{1}}设置为{{1 }}:

SortExpression

但是,您正在使用SqlDataSource(我不熟悉并亲自避免)您动态创建了null。 GridView的RowCollection也是空的吗?您是否最近在Page_Load中使用与之前相同的ID在每个回发上重新创建动态GridView?