簡體   English   中英

索引超出范圍異常ASP C#

[英]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>
    &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找不到任何行,因此當您引用第一行時,它將引發錯誤。

引用DropdownLists的selectedValues可能非常棘手,因為它們通常在請求的生命周期中很晚才初始化。 即使設置selectedValue通常也無法在同一請求期間被讀出,因為在設置時,它將值存儲在一個臨時位置中,供以后在實際數據綁定期間使用。 除非強制執行,否則數據綁定只有在渲染之前(即Load_Page發生之后)才會發生。 希望能闡明原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM