2017-07-04 2 views
0

おそらくこれは簡単ですが、グリッドビューの列に対してソートを行うには問題が発生しています。アイデアは、列でクリックすることです:ファミリー、レシピ、トップ品番、汎用:だから、GridViewのは、次の列の値が相談SQLクエリによって取得され、それらがGridViewのにバインドされ供給される様子を説明グリッドビューで列がソートされていない

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

部品番号、部品番号、部品番号、部品番号1、部品番号2、部品番号2、部品番号3、部品番号3が含まれます。 アトリッション、インベントリChild1、インベントリChild2、インベントリChild3、および使用可能インベントリの値は、gridviewのRowDataBoundメソッドで計算されます。 いくつかのドロップダウンリストを選択すると、gridviewがページに読み込まれます。

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> 

sortDirection方法方法

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


    } 

をソート

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

だから、問題は、私は次のエラーを取得するようソートが機能していないです。

System.Data.dllで 'System.IndexOutOfRangeException'型の例外が発生しましたが、ユーザーコードで処理されませんでした 追加情報:列availInventoryが見つかりません。

ご迷惑をおかけして申し訳ございません。 ありがとう

EDIT RowDataBoundメソッドの内部に含まれるdatatableにgridviewの値を取得/格納するコードを追加しました。この方法は、私がデータテーブルを形成し、セッション変数を定義する場所ので、私は唯一の掲示しています大きすぎる:

  //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; 
+0

これは、 'availInventory'カラムがソースデータに存在しないことを意味します。スペルミスをチェックする必要があります。 – VDWWD

+0

データテーブルを含むセッション変数を定義する場所を追加しました。私が知らないことは、gridviewから取得した最後の値を格納するために使用されるdatatableでsortExpression(availInventory)を定義する必要がある場合、またはこのエラーが起きた理由は何ですか? – Antonio

+0

あなたは 'SortExpression' availInventoryを送りますが、' DataTable'にそのような列はなく、 'Available Inventory'だけです。したがって、これらが同じであることを確認してください(列名のスペースの使用はお勧めしません) – VDWWD

答えて

0

エラーは次のとおりです。Cannot find column availInventory.

あなたのバインドされたフィールドは

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

変更してみてくださいです一致するようにSortExpressionをAvailable Inventoryに設定します。

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

関連する問題