[英]Index out of range exception ASP C#
我正在為e start網站建立產品頁面。 我有兩個下拉列表。
ddlProducts連接到SQL數據源,SQL數據源從ddlProducts檢索產品信息以進行填充。
ddlCategory包含產品類別的列表。
我正在嘗試做的是允許用戶從ddlCategory中選擇產品類別,然后ddlProducts將僅使用數據庫表中與該特定類別匹配的項目進行填充。
ddlProducts然后使用方法GetSelectedProduct()從數據庫中檢索所選產品所需的字段,以在網頁的其余部分上顯示信息。
這是問題所在。 當我運行頁面時,ddlProducts會填充特定於ddlCategory中默認選擇的產品(在這種情況下,類別為“客廳”)。 現在,只要我不嘗試在ddlCategory中更改選擇,那么一切都很好。 我可以使用ddlProducts,並且一切都會做它應該做的事情。
但是,如果我嘗試更改ddlCategory上的選擇,則GetSelectedProduct()會在第1行拋出Index out of range異常
DataRowView行= productsTable [0];
我不知道為什么。
有人可以在這里提供任何見解嗎? 謝謝。
下拉列表代碼
<asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true">
<asp:ListItem Value="Living Room">Living Room</asp:ListItem>
<asp:ListItem Value="Dining Room">Dining Room</asp:ListItem>
<asp:ListItem Value="Bedroom">Bedroom</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="ddlProducts" runat="server"
AutoPostBack="True" DataSourceID="SqlDataSource1"
DataTextField="productName" DataValueField ="productID">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:OneStopConnectionString %>"
ProviderName="<%$ ConnectionStrings:OneStopConnectionString.ProviderName %>"
SelectCommand="SELECT [productID], [productName], [productRetail], [productImage] FROM [product] WHERE ([productRoom] = ?)">
<SelectParameters>
<asp:ControlParameter ControlID="ddlCategory" Name="productRoom" PropertyName="SelectedValue" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
產品頁面的返回碼
public partial class _Default : System.Web.UI.Page
{
private Product selectedProduct;
protected void Page_Load(object sender, EventArgs e)
{
//bind drop-down list on first load
//get and show product on every load
if (!IsPostBack) ddlProducts.DataBind();
selectedProduct = this.GetSelectedProduct();
lblName.Text = selectedProduct.Name;
lblUnitPrice.Text = selectedProduct.UnitPrice.ToString() + " each";
imgProduct.ImageUrl = "Images / Products /" + selectedProduct.ImageFile;
}
private Product GetSelectedProduct()
{
//get row from SqlDataSource based on value in dropdown list
DataView productsTable = (DataView)
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
productsTable.RowFilter = string.Format("productID = '{0}'", ddlProducts.SelectedValue);
DataRowView row = productsTable[0]; <------line that is throwing the exception
//create a new product object and load with data from row
Product p = new Product();
p.ProductID = row["ProductID"].ToString();
p.Name = row["ProductName"].ToString();
p.UnitPrice = row["productRetail"].ToString();
p.ImageFile = row["productImage"].ToString();
return p;
}
您需要在調用GetSelectedProduct之前對ddlProducts進行數據綁定,否則它將沒有正確初始化,因此您將無法引用SelectedValue。
由於ddlProducts.SelectedValue返回一個意外值,因此您的RowFilter找不到任何行,因此當您引用第一行時,它將引發錯誤。
引用DropdownLists的selectedValues可能非常棘手,因為它們通常在請求的生命周期中很晚才初始化。 即使設置selectedValue通常也無法在同一請求期間被讀出,因為在設置時,它將值存儲在一個臨時位置中,供以后在實際數據綁定期間使用。 除非強制執行,否則數據綁定只有在渲染之前(即Load_Page發生之后)才會發生。 希望能闡明原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.