索引超出范围异常
本文关键字:异常 范围 索引 | 更新日期: 2023-09-27 18:17:03
我正在为一个电子商务网站建立一个产品页面。我有两个下拉列表。
ddlProducts连接到一个SQL数据源,它从中检索产品信息以填充它。
ddlCategory包含产品类别列表。
我要做的是允许用户从ddlCategory中选择一个产品类别,然后ddlProducts将只使用数据库表中与该特定类别匹配的项目填充。
然后,ddlProducts使用GetSelectedProduct()方法从数据库中检索所选产品所需的字段,以便在网页的其余部分显示信息。
问题在这里。当我运行页面时,ddlProducts被填充为ddlCategory中特定于默认选择的产品(在本例中,类别是"Living Room")。现在只要我不试图改变ddlCategory中的选择,那么一切都很好。我可以使用ddlProducts,所有的东西都做它应该做的。
然而,如果我试图改变ddlCategory上的选择,那么GetSelectedProduct()会在
行抛出Index out of range异常DataRowView row = 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没有找到任何行,所以当你去引用第一行时,它会抛出一个错误。
引用下拉列表的selectedValues可能非常棘手,因为它们通常在请求生命周期的很晚才初始化。即使经常设置selectedValue,也不能在同一个请求期间读回来,因为在设置时,它将值存储在一个临时位置,以便在实际数据绑定期间稍后使用。除非强制,否则数据绑定直到渲染之前才发生,这是在Load_Page发生之后的一种方式。