簡體   English   中英

System.IndexOutOfRangeException:找不到XYZ列對GridView進行排序

[英]System.IndexOutOfRangeException: Cannot find column XYZ sorting GridView

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

我已經將GridView上的AllowSorting-property設置為true ,並向該列添加了排序表達式

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

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

下面是我應該可以排序的列的代碼隱藏文件 ,但出現錯誤:

異常詳細信息:System.IndexOutOfRangeException:找不到列doName。

后面的代碼:

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

發生此異常是因為在gvProducts_PageIndexChanging方法中, dt1值已重置為新的DataTable() ,它沒有任何行或列。

因此,您必須重新加載dt1.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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM