索引超出范围异常

本文关键字:异常 范围 索引 | 更新日期: 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>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <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发生之后的一种方式。