Я строю страницу продуктов для начинающего сайта. У меня есть два выпадающих списка.Указатель за пределами допустимого диапазона 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>
<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;
}
Вы проверили, действительно ли фильтр строк фактически возвращает данные? Является ли productID int или строкой? Ваш фильтр заставляет его казаться строкой, но если это не так, это может быть частью проблемы. – Tim
Что такое 'Product', это DataSet, DataTable, ..Class..show все соответствующие коды и почему бы не привязывать DataView к DataTable DataTables поддерживает функцию .Select для фильтрации также – MethodMan