索引超出范围异常ASP C#

时间:2015-10-09 19:01:33

标签: c# asp.net

我正在为e开始网站构建产品页面。我有两个下拉列表。

ddlProducts连接到SQL数据源,从中检索产品信息以填充它。

ddlCategory包含产品类别列表。

我要做的是允许用户从ddlCategory中选择产品类别,然后ddlProducts将只填充数据库表中与该特定类别匹配的项目。

然后,

ddlProducts使用方法GetSelectedProduct()从数据库中检索所选产品所需的字段,以显示网页其余部分的信息。

这是问题所在。当我运行页面时,ddlProducts会填充特定于ddlCategory默认选择的产品(在这种情况下,类别为“Living Room”)。现在,只要我不尝试更改ddlCategory中的选择,那么一切都很好。我可以使用ddlProducts,一切都按照它应该做的。

但是,如果我尝试更改ddlCategory上的选择,则GetSelectedProduct()会在行

处抛出索引超出范围的异常

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;
}

1 个答案:

答案 0 :(得分:2)

您需要在调用GetSelectedProduct之前对ddlProducts进行数据绑定,否则它无法正确初始化,您无法引用SelectedValue。

由于ddlProducts.SelectedValue返回了一个意外的值,因此你的RowFilter找不到任何行,所以当你去引用第一行时,它会抛出一个错误。

引用DropdownLists的selectedValues非常棘手,因为它们通常在请求的生命周期中很晚才被初始化。即使经常设置selectedValue也不能在同一请求期间读回,因为在设置时它将值存储在临时位置以供以后在实际数据绑定期间使用。除非被强制,否则直到渲染之前才会发生数据绑定,这是在Load_Page发生之后。希望澄清原因。