そのため、コード ビハインドにデータを入力しているグリッドビューがあり、ドロップダウンをリッスンして何を入力するかを確認しています。その部分はうまく機能します。しかし、グリッドビューから行編集イベントを発生させると、データバインド プロセスで NullReferenceException エラーがスローされます。
ここにページがあります:
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div id="categories">
<h1>Categories</h1>
<asp:DropDownList ID="ddlCategories"
runat="server"
OnSelectedIndexChanged="ddlCategories_SelectedIndexChanged"
AutoPostBack="true"></asp:DropDownList>
</div>
<div id="products">
<h1>Products</h1>
<asp:GridView ID="gvProducts"
runat="server"
AutoGenerateColumns="false"
OnRowEditing="gvProducts_RowEditing"
AutoGenerateDeleteButton="True"
AutoGenerateEditButton="True"
OnRowCancelingEdit="gvProducts_RowCancelingEdit"
OnRowUpdating="gvProducts_RowUpdating">
<Columns>
<asp:BoundField
DataField="Category.Name"
HeaderText="Category" />
<asp:BoundField
Datafield="Name"
HeaderText="Name"/>
<asp:BoundField
Datafield="Description"
HeaderText="Description"/>
<asp:BoundField
DataField="Price"
HeaderText="Price"
DataFormatString="{0:c}"
HtmlEncode="False"/>
<asp:ImageField
DataImageUrlField="ImageURL"
HeaderText="Picture"></asp:ImageField>
<asp:CheckBoxField
DataField="Active"
Text="Active"
HeaderText="Status"/>
</Columns>
</asp:GridView>
</div>
</ContentTemplate>
</asp:UpdatePanel>
コードビハインドは次のとおりです。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindCategoryList();
BindProductList();
}
}
protected void BindCategoryList()
{
ddlCategories.DataTextField = "Name";
ddlCategories.DataValueField = "CategoryID";
ddlCategories.DataSource = CategoryDB.GetCategories();
ddlCategories.DataBind();
ddlCategories.Items.Insert(0, new ListItem(string.Empty));
ddlCategories.SelectedIndex = 0;
}
protected void BindProductList(int categoryID = 0)
{
gvProducts.DataSource = ProductDB.GetProductsByCategory(categoryID);
gvProducts.DataBind();
}
protected void ddlCategories_SelectedIndexChanged(object sender, EventArgs e)
{
BindProductList(Int32.Parse(ddlCategories.SelectedValue));
}
protected void gvProducts_RowEditing(object sender, GridViewEditEventArgs e)
{
gvProducts.EditIndex = e.NewEditIndex;
BindProductList(Int32.Parse(ddlCategories.SelectedValue));
}
エラーは BindProductList() メソッドで発生しますが、gvProducts_RowEditing から呼び出された場合のみです。それ以外の場合は、正常に動作します。デバッグすると、確実に正しい categoryID 値が渡され、DataBind 呼び出しまでエラーがスローされないことがわかります。これは、DataSource() 呼び出しの gvProducts を引き続き見つけることができることを意味します。
何か案は?ありがとう。
編集: これは、categorydb クラスと getcategories メソッドです。
public class CategoryDB
{
public static List<Category> GetCategories()
{
using (var db = new ProductContext())
{
return (from c in db.Categories
orderby c.Name
select c).ToList<Category>();
}
}