おそらくこれは簡単ですが、グリッドビューの列に対してソートを行うには問題が発生しています。アイデアは、列でクリックすることです:ファミリー、レシピ、トップ品番、汎用:だから、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;
これは、 'availInventory'カラムがソースデータに存在しないことを意味します。スペルミスをチェックする必要があります。 – VDWWD
データテーブルを含むセッション変数を定義する場所を追加しました。私が知らないことは、gridviewから取得した最後の値を格納するために使用されるdatatableでsortExpression(availInventory)を定義する必要がある場合、またはこのエラーが起きた理由は何ですか? – Antonio
あなたは 'SortExpression' availInventoryを送りますが、' DataTable'にそのような列はなく、 'Available Inventory'だけです。したがって、これらが同じであることを確認してください(列名のスペースの使用はお勧めしません) – VDWWD