【问题标题】:Sorting column not working on gridview排序列在gridview上不起作用
【发布时间】:2017-07-04 17:40:57
【问题描述】:

这可能很容易,但我在为 gridview 的列进行排序时遇到了麻烦。这个想法是点击列:

<asp:BoundField ItemStyle-Width="150px"  HeaderText="Available Inventory" SortExpression="availInventory" />

所以解释了 gridview 的来源,以下列值是通过 sql 查询查询获得的,并且它们绑定到 gridview:Family, Recipe, Top Part Number, Generic Part Number, Child#1 Part Number, Factor Child1, Child#2 零件号,Child#3 零件号,Child2 因子,Child#3 零件号,Child3 因子。 列 Attrition、Inventory Child1、Inventory Child2、Inventory Child3 和 Available Inventory 的值在 gridview 的 RowDataBound 方法中计算。 选择一些下拉列表后,gridview 会在页面加载。

网格视图

        <asp:GridView ID="recipegrid" runat="server" Width="1200px" Height="152px" AutoGenerateColumns="false" AllowSorting="true" OnSorting="recipegrid_Sorting" CssClass="generalgrid" AllowPaging="true" OnPageIndexChanging="OnPaging" PageSize="50" OnRowDataBound="recipegrid_RowDataBound" OnSelectedIndexChanged="recipegrid_SelectedIndexChanged" HeaderStyle-CssClass="gridHeader" RowStyle-CssClass="gridRows" PagerStyle-CssClass="paginationRow" OnDataBound="recipegrid_DataBound"> 
        <Columns>
    <asp:BoundField ItemStyle-Width="150px" DataField="Family" HeaderText="Family" />
    <asp:BoundField ItemStyle-Width="150px" DataField="RecipePN" HeaderText="Recipe" />
    <asp:BoundField ItemStyle-Width="150px" DataField="TopPN" HeaderText="Top Part Number" />
    <asp:BoundField ItemStyle-Width="150px" DataField="GenericPN" HeaderText="Generic Part Number" />
    <asp:BoundField ItemStyle-Width="150px"  HeaderText="Attrition" />
    <asp:BoundField ItemStyle-Width="150px" DataField="Child1PN" HeaderText="Child#1 Part Number" />
    <asp:BoundField ItemStyle-Width="150px" DataField="FactorChild1" HeaderText="Factor Child1" />
    <asp:BoundField ItemStyle-Width="150px"  HeaderText="Inventory Child1" />
    <asp:BoundField ItemStyle-Width="150px" DataField="Child2PN" HeaderText="Child#2 Part Number" />
    <asp:BoundField ItemStyle-Width="150px" DataField="FactorChild2" HeaderText="Factor Child2" />
    <asp:BoundField ItemStyle-Width="150px"  HeaderText="Inventory Child2" />
    <asp:BoundField ItemStyle-Width="150px" DataField="Child3PN" HeaderText="Child#3 Part Number" />
    <asp:BoundField ItemStyle-Width="150px" DataField="FactorChild3" HeaderText="Factor Child3" />
    <asp:BoundField ItemStyle-Width="150px"  HeaderText="Inventory Child3" />
    <asp:BoundField ItemStyle-Width="150px"  HeaderText="Available Inventory" SortExpression="availInventory" />

    <asp:TemplateField HeaderText="Status" Visible="false" ItemStyle-Width="150px">
            <ItemTemplate>
                <asp:Label ID="lblStatus" runat="server"></asp:Label>
            </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Select Data" ItemStyle-Width="150px" >  
                <ItemTemplate>  
                    <asp:RadioButton ID="recipeselector"  runat="server" AutoPostBack="true"  OnCheckedChanged="rbtnSelect_CheckedChanged" />
                   <!-- <asp:HiddenField ID="HiddenField1" runat="server"  /> -->
                </ItemTemplate>  
    </asp:TemplateField>  

        </Columns>
        <EmptyDataTemplate><label class="labelemptygriddata"> No data loaded from DB!</label> </EmptyDataTemplate>
    </asp:GridView> 

排序方法

        private string sortDirectionMethod (SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;

        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;

            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }

        return newSortDirection;
    }

排序方法

        protected void recipegrid_Sorting(object sender, GridViewSortEventArgs e)
    {

        //DataTable dt = recipegrid.DataSource as DataTable;
        DataTable dt = new DataTable();

        //Session["grid"] = recipegrid.DataSource;


        dt = (DataTable)Session["grid"];


        if (dt != null)
        {
            DataView dv = new DataView(dt);
            dv.Sort = e.SortExpression + " " + sortDirectionMethod(e.SortDirection);

            recipegrid.DataSource = dv;
            recipegrid.DataBind();
        }


    }

所以问题是排序不起作用,因为我收到以下错误:

System.Data.dll 中出现“System.IndexOutOfRangeException”类型的异常,但未在用户代码中处理 附加信息:找不到列availInventory。

任何帮助或指导将不胜感激。 谢谢

编辑 将获取/存储gridview值的代码添加到数据表中,该数据表包含在RowDataBound方法中。该方法太大,所以我只在我形成数据表并定义会话变量的地方发布:

            //copy info from gridview to session
        //need to add each column name and type
        DataTable dt = new DataTable();
        DataRow dr;
        //Boolean noCheck = false;

        //column Family
        dt.Columns.Add("Family", typeof(string));
        //column Recipe
        dt.Columns.Add("Recipe", typeof(string));
        //column Top Part Number
        dt.Columns.Add("Top Part Number", typeof(string));
        //column Generic Part Number
        dt.Columns.Add("Generic Part Number", typeof(string));
        //column Attrition
        dt.Columns.Add("Attrition", typeof(string));

        //column child#1 Part Number
        dt.Columns.Add("Child#1 Part Number", typeof(string));
        //column Factor Child1
        dt.Columns.Add("Factor Child1", typeof(string));
        //column Inventory Child1
        dt.Columns.Add("Inventory Child1", typeof(string));

        //column Child#2 Part Number
        dt.Columns.Add("Child#2 Part Number", typeof(string));
        //column Factor Child2
        dt.Columns.Add("Factor Child2", typeof(string));
        //column Inventory Child2
        dt.Columns.Add("Inventory Child2", typeof(string));

        //column Child#3 Part Number
        dt.Columns.Add("Child#3 Part Number", typeof(string));
        //column Factor Child3
        dt.Columns.Add("Factor Child3", typeof(string));
        //column Inventory Child3
        dt.Columns.Add("Inventory Child3", typeof(string));

        //column Available Inventory 
        dt.Columns.Add("Available Inventory", typeof(Int32));

        //column select data
        dt.Columns.Add("Select Data", typeof(string));

        foreach (GridViewRow row in recipegrid.Rows)
        {
            System.Web.UI.WebControls.RadioButton selectData = (System.Web.UI.WebControls.RadioButton)row.FindControl("recipeselector");
            dr = dt.NewRow();

            //family
            dr[0] = row.Cells[0].Text;
            //recipe
            dr[1] = row.Cells[1].Text;
            //top partnumber
            dr[2] = row.Cells[2].Text;
            //generic partnumber
            dr[3] = row.Cells[3].Text;
            //attrition
            dr[4] = row.Cells[4].Text;

            //child#1 partnumber
            dr[5] = row.Cells[5].Text;
            //factor child1
            dr[6] = row.Cells[6].Text;
            //inventory child1
            dr[7] = row.Cells[7].Text;

            //child#2 partnumber
            dr[8] = row.Cells[8].Text;
            //factor child2
            dr[9] = row.Cells[9].Text;
            //inventory child2
            dr[10] = row.Cells[10].Text;

            //child#3 partnumber
            dr[11] = row.Cells[11].Text;
            //factor child3
            dr[12] = row.Cells[12].Text;
            //inventory child3
            dr[13] = row.Cells[13].Text;


            //available inventory
            dr[14] = Convert.ToInt32(row.Cells[14].Text);

            //select data
            dr[15] = selectData.Checked = false;

            dt.Rows.Add(dr);
        }
        Session["grid"] = dt;

【问题讨论】:

  • 这意味着源数据中不存在列availInventory。您应该检查拼写错误。
  • 我添加了定义包含数据表的会话变量的位置。我不知道的是,我是否必须在用于存储从 gridview 获得的最后一个值的数据表中定义 sortExpression (availInventory),或者为什么会出现这个错误?
  • 您发送了SortExpressionavailInventory,但DataTable中没有这样的列,只有Available Inventory。所以请确保它们是相同的(不建议在列名中使用空格)

标签: c# asp.net aspxgridview gridview-sorting


【解决方案1】:

错误是:Cannot find column availInventory.

你的绑定字段是

<asp:BoundField ItemStyle-Width="150px"  HeaderText="Available Inventory"
    SortExpression="availInventory" />

尝试将 SortExpression 更改为 Available Inventory,以匹配

dt.Columns.Add("Available Inventory", typeof(Int32));.

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多