2015-10-09 4 views
0

Я строю страницу продуктов для начинающего сайта. У меня есть два выпадающих списка.Указатель за пределами допустимого диапазона ASP C#

ddlProducts подключен к источнику данных SQL, из которого он извлекает информацию о продукте для ее заполнения.

ddlCategory содержит список категорий товаров.

Что я пытаюсь сделать, так это разрешить пользователю выбирать категорию продукта из ddlCategory, а затем ddlProducts заполняет только элементы из таблицы базы данных, соответствующие этой конкретной категории.

ddlProducts затем использует метод GetSelectedProduct() для извлечения необходимых полей для выбранного продукта из базы данных для отображения информации на остальной веб-странице.

В этом проблема. Когда я запускаю страницу, ddlProducts заполняется продуктами, специфичными для выбора по умолчанию из ddlCategory (в случае, категория «Гостиная»). Теперь, пока я не пытаюсь изменить выбор в ddlCategory, тогда все в порядке. Я могу использовать ddlProducts, и все делает то, что он должен делать.

Однако при попытке изменить выбор на ddlCategory, то GetSelectedProduct() выдает индекс из диапазона исключения в строке

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

Вы проверили, действительно ли фильтр строк фактически возвращает данные? Является ли productID int или строкой? Ваш фильтр заставляет его казаться строкой, но если это не так, это может быть частью проблемы. – Tim

+0

Что такое 'Product', это DataSet, DataTable, ..Class..show все соответствующие коды и почему бы не привязывать DataView к DataTable DataTables поддерживает функцию .Select для фильтрации также – MethodMan

ответ

2

Вам необходимо ddlProducts привязки перед вызовом GetSelectedProduct, в противном случае он не инициализирован правильно, и вы не можете ссылаться на SelectedValue.

Поскольку ddlProducts.SelectedValue возвращает неожиданное значение, ваш RowFilter не находит никаких строк, поэтому, когда вы идете и ссылаетесь на первую строку, он затем выдает ошибку.

Ссылка на выбранные значения DropdownLists может быть очень сложной, поскольку они обычно инициализируются очень поздно в жизненном цикле запроса. Даже установка значения selectedValue часто не может быть считана обратно во время одного и того же запроса, потому что при ее установке оно хранит значение во временном месте для последующего использования во время фактического привязки данных. Если не принудительно, привязка данных происходит не раньше, чем до рендера, что происходит после загрузки Load_Page. Надеюсь, что это объясняет, почему.

+0

Спасибо, Роберт. Задача решена. – tworley1977

Смежные вопросы