【问题标题】:System.IndexOutOfRangeException: Cannot find column XYZ sorting GridViewSystem.IndexOutOfRangeException:找不到列 XYZ 排序 GridView
【发布时间】:2015-07-29 10:34:13
【问题描述】:

我需要在 GridView 的列中添加一个排序功能

我已将 GridView 上的 AllowSorting-property 设置为 true 并将 sort expression 添加到列中。

<asp:BoundField DataField="doName" HeaderText="doName" SortExpression="doName" />

不幸的是,排序在 GridView 中不起作用。

下面是我应该能够排序的列的代码隐藏文件,但我收到错误:

异常详细信息:System.IndexOutOfRangeException:找不到列 名称。

背后的代码:

string sortingDirection;
DataSet dsProducts = new DataSet();
DataTable dt1 = new DataTable();

public SortDirection dir
{
    get
    {
        if (ViewState["dirState"] == null)
        {
            ViewState["dirState"] = SortDirection.Ascending;
        }
        return (SortDirection)ViewState["dirState"];
    }
    set
    {
        ViewState["dirState"] = value;
    }
}

public string SortField
{
    get
    {
        return (string)ViewState["SortField"] ?? "doName";
    }
    set
    {
        ViewState["SortField"] = value;
    }
}

protected void gvProducts_Sorting(object sender, GridViewSortEventArgs e)
{

    sortingDirection = string.Empty;
    if (dir == SortDirection.Ascending)
    {
        dir = SortDirection.Descending;
        sortingDirection = "Desc";
    }
    else
    {
        dir = SortDirection.Ascending;
        sortingDirection = "Asc";
    }


    DataView sortedView = new DataView(dt1);
    sortedView.Sort = e.SortExpression + " " + sortingDirection;
    SortField = e.SortExpression;
    gvProducts.DataSource = sortedView;
    gvProducts.DataBind();
}

protected void gvProducts_PageIndexChanging(object sender, GridViewPageEventArgs e)
{       
    if (dir == SortDirection.Ascending)
    {
        sortingDirection = "Asc";
    }
    else
    {
        sortingDirection = "Desc";
    }

    DataView sortedView = new DataView(dt1);
    sortedView.Sort = SortField + " " + sortingDirection;
    gvProducts.DataSource = sortedView;
    gvProducts.PageIndex = e.NewPageIndex;
    gvProducts.DataBind();
}

private void BindData()
{
    gvProducts.DataSource = RetrieveProducts();
    gvProducts.DataBind();
}

private DataSet RetrieveProducts()
{
    sql = "Select * from doTable;";

    dsProducts = new DataSet();

    using (OdbcConnection cn =
      new OdbcConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
    {
        cn.Open();

        using (OdbcCommand cmd = new OdbcCommand(sql, cn))
        {

            OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
            adapter.Fill(dsProducts);

            dt1 = new DataTable();
            dsProducts.Tables.Add(dt1);
        }
    }

    return dsProducts;
}

【问题讨论】:

  • 您后面的代码看起来像是一个类。这很令人困惑,我不知道您为什么有 SortDirection 的属性,而其中没有什么?!

标签: c# asp.net gridview


【解决方案1】:

发生此异常是因为在gvProducts_PageIndexChanging 方法中,dt1 的值已重置为新的DataTable(),它没有任何行或列。

所以你必须重新加载dt1.的值

如下更改您的代码。

OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
adapter.Fill(dsProducts);

if (dsProducts.Tables.Count > 0)
{
    dt1 = dsProducts.Tables[0];
}

dtProducts = dt1;

-------------------------------------------

protected void gvProducts_Sorting(object sender, GridViewSortEventArgs e)
{
    sortingDirection = string.Empty;
    if (dir == SortDirection.Ascending)
    {
        dir = SortDirection.Descending;
        sortingDirection = "Desc";
    }
    else
    {
        dir = SortDirection.Ascending;
        sortingDirection = "Asc";
    }

    BindData();
    DataView sortedView = new DataView(dt1);
    sortedView.Sort = e.SortExpression + " " + sortingDirection;
    SortField = e.SortExpression;
    gvProducts.DataSource = sortedView;
    gvProducts.DataBind();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2019-10-26
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多