#asp.net #vb.net #declaration #scalar
#asp.net #vb.net #декларация #скалярный
Вопрос:
Я некоторое время отлаживал свой код и просматривал сообщения на других форумах, но, похоже, у каждого своя проблема, отличная от моей, и то, что работает для них, не будет работать для меня.
Предполагается, что мой выпадающий список фильтрует сетку, выбирая все компании, связанные с определенным продуктом. Решение, которое я нашел в Интернете, заключается в том, что у большинства людей не было DataKeyNames, установленных в их gridview.
У меня есть этот набор, но не для CompanyID. В этом не было бы никакого смысла. Так что я понятия не имею, что мне делать, поскольку это единственный ответ, который я нашел.
<asp:DropDownList ID="ddlCompany" runat="server" DataSourceID="dsCompanyFilter"
DataTextField="CompanyName" DataValueField="CompanyID" AppendDataBoundItems="true"
AutoPostBack="true">
Protected Sub ddlCompany_SelectedIndexChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles ddlCompany.SelectedIndexChanged
Dim CompanyID As Integer = ddlCompany.SelectedValue
dsProductLookup.SelectCommand = "SELECT ProductName, CompanyID, CompanyName
FROM Product, Company
WHERE CompanyID = @CompanyID
ORDER BY ProductName"
dsProductLookup.SelectParameters.Add("@CompanyID", ddlCompany.SelectedValue)
End Sub
<asp:gridview id="gvProducts" runat="server" AutoGenerateColumns="false"
datakeynames="ProductID" datasourceid="dsProductLookup" style="margin-top: 12px;">
<asp:sqldatasource id="dsProductLookup" runat="server"
Connectionstring="<%$ ConnectionStrings:ProductsConnectionString %>"
SelectCommand="SELECT ProductID, ProductName FROM [Product] ORDER BY [ProductName]">
</asp:sqldatasource>
<asp:SqlDataSource ID="dsCompanyFilter" runat="server"
ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>"
SelectCommand="SELECT [CompanyName], [CompanyID] FROM [Company] ORDER BY CompanyName">
</asp:SqlDataSource>
ОБНОВЛЕНИЕ: я попытался добавить это на другую страницу своего сайта и получил ту же ошибку объявления. Must declare the scalar variable "@CompanyID".
Choose Company: <asp:DropDownList ID="ddlCompany" runat="server" DataSourceID="dsCompanyFilter" DataTextField="CompanyName" DataValueField="CompanyID" AppendDataBoundItems="true" AutoPostBack="true">
<asp:ListItem Enabled="true" Text="Select an option"></asp:ListItem>
</asp:DropDownList>
<asp:gridview id="gvCategories" runat="server" AutoGenerateColumns="False"
datakeynames="CategoryID,CompanyID" datasourceid="dsCategoryLookup" emptydatatext="No
categories/products found." style="margin-top: 12px;">
<Columns>
<asp:BoundField HeaderText="Category Name" DataField="CategoryName" />
<asp:HyperLinkField DataNavigateUrlFields="ProductID"
DataNavigateUrlFormatString="Product/Default.aspx?ID={0}"
DataTextField="ProductName"
HeaderText="Product Name" />
</Columns>
</asp:gridview>
<asp:SqlDataSource ID="dsCategoryLookup" runat="server"
ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>"
SelectCommand="SELECT DISTINCT c.CategoryName, c.CategoryID, p.ProductName,
p.ProductID, cl.CompanyID, cl.ProductID, co.CompanyID
FROM Category AS c
INNER JOIN CategoryLink AS l ON l.CategoryID = c.CategoryID
INNER JOIN Product AS p ON p.ProductID = l.ProductID
LEFT JOIN CompanyLink AS cl ON cl.ProductID = p.ProductID">
</asp:SqlDataSource>
<asp:SqlDataSource ID="dsCompanyFilter" runat="server"
ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>"
SelectCommand="SELECT [CompanyName], [CompanyID]
FROM [Company]
ORDER BY CompanyName">
</asp:SqlDataSource>
Protected Sub ddlCompany_SelectedIndexChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles ddlCompany.SelectedIndexChanged
dsCategoryLookup.SelectCommand = "SELECT Category.CategoryName,
CategoryLink.ProductID, Company.CompanyName,
Company.CompanyID, CompanyLink.CompanyID AS Expr1,
Product.ProductName, Product.ProductID,
CompanyLink.ProductID AS Expr2
FROM Company
LEFT JOIN CompanyLink
ON Company.CompanyID = CompanyLink.CompanyID
LEFT JOIN Product
ON CompanyLink.ProductID = Product.ProductID
LEFT JOIN CategoryLink
ON CategoryLink.ProductID = Product.ProductID
LEFT JOIN Category
ON CategoryLink.CategoryID = Category.CategoryID
WHERE Company.CompanyID = @CompanyID
ORDER BY Product.ProductName"
Ответ №1:
Вместо установки параметра в коде, добавьте a ControlParameter
в разметку для элемента управления источником данных.
<SelectParameters>
<asp:ControlParameter ControlID="ddlCompany" PropertyName="SelectedValue" DbType="Int32" DefaultValue="0" />
</SelectParameters>
Учитывая ваше описание, я думаю, что вышеизложенное должно решить вашу проблему, но если нет, вы не должны чувствовать себя обескураженным от добавления CompanyID
в качестве ключа данных. Просто не забудьте включить CompanyID
в качестве столбца в инструкцию select of dsProductLookup
.
Редактировать
Похоже, я опустил имя параметра в предыдущем ответе. Попробуйте что-то вроде этого вместо:
<SelectParameters>
<asp:ControlParameter Name="CompanyID" ControlID="ddlCompany" PropertyName="SelectedValue" Type="Int32" DefaultValue="0" />
</SelectParameters>
Как я уже сказал, я не использую элементы управления источником данных, поэтому я не уверен, нужно ли добавлять к имени параметра префикс @
или нет, но если вы это сделаете:
<SelectParameters>
<asp:ControlParameter Name="@CompanyID" ControlID="ddlCompany" PropertyName="SelectedValue" Type="Int32" DefaultValue="0" />
</SelectParameters>
Комментарии:
1. Я попытался добавить это в источник данных dsCompanyFilter, и я получил сообщение об ошибке
Input string was not in a correct format.
2. Я добавил выпадающий список на другую свою страницу и снова столкнулся со скалярной проблемой, но на этот раз я добавил CompanyID в качестве ключа данных и включил CompanyID в инструкцию select. Я попытался использовать имеющийся у вас код SelectParameters, но он выдал ту же ошибку, что и выше. Входная строка…. Я не хочу начинать новый поток, потому что это одна и та же ошибка в большей или меньшей степени. Вы можете мне помочь?
3. В чем разница между этими двумя, и какую ошибку вы получаете?
4. Я отредактировал исходное сообщение с кодом со своей второй страницы с ошибкой
Must declare the scalar variable @CompanyID
5. Почему вы обновляете инструкцию select при изменении выбранного индекса? Вам не нужно этого делать. Я не использую элементы управления источником данных, но вы должны иметь возможность просто вызывать
Databind()
GridView.
Ответ №2:
Я смог найти ответ на этот вопрос. ASP.net форум, который работает с моим сайтом. (Пока …)
Protected Sub ddlCompany_SelectedIndexChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles ddlCompany.SelectedIndexChanged
dsProductLookup.SelectCommand = "SELECT Company.CompanyName, Company.CompanyID,
CompanyLink.CompanyID AS Expr1,
Product.ProductName, Product.ProductID,
CompanyLink.ProductID AS Expr2
FROM Company
INNER JOIN CompanyLink ON Company.CompanyID = CompanyLink.CompanyID
INNER JOIN Product ON CompanyLink.ProductID = Product.ProductID
WHERE Company.CompanyID = @CompanyID
ORDER BY Product.ProductName"
dsProductLookup.SelectParameters.Clear()
Dim controlParam As ControlParameter = New ControlParameter
controlParam.ControlID = "ddlCompany"
controlParam.DefaultValue = "-1"
controlParam.Name = "CompanyID"
controlParam.PropertyName = "SelectedValue"
controlParam.Type = TypeCode.Decimal
dsProductLookup.SelectParameters.Add(controlParam)
End Sub