0

我在 VB 中有一个 Visual Studio 2010 asp.net 页面,我在其中加入了多个表,SqlDataSource以在 gridview 中显示特定列。表连接后,我有一个下拉列表,我希望它只显示那些“SKillGroup”列值等于下拉列表中所选项目的行。但是,在运行页面时,下拉列表中只有一个在列表中重复的选定项目(该项目是硬件)。

我的问题是如何使下拉列表显示“硬件”“软件”和“网络”的所有三个项目,并根据所选搜索将其填充到网格视图中?

这是我的下拉列表和网格视图代码

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
            DataSourceID="ProblemDataSource" DataTextField="SkillGroup" 
            DataValueField="SkillGroup">
            <asp:ListItem Selected="True">Hardware</asp:ListItem>
            <asp:ListItem Selected="True">Software</asp:ListItem>
            <asp:ListItem Selected="True">Network</asp:ListItem>
        </asp:DropDownList>

     <asp:GridView ID="ProblemGridView" runat="server" AutoGenerateColumns="False" 
            DataSourceID="ProblemDataSource" style="margin-top: 0px" 
            AllowPaging="True">
            <Columns>
                <asp:BoundField DataField="ProblemID" HeaderText="ProblemID" 
                    SortExpression="ProblemID" />
                <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" 
                    SortExpression="CustomerID" />
                <asp:BoundField DataField="Summary" HeaderText="Summary" 
                    SortExpression="Summary" />
                <asp:BoundField DataField="DateLogged" HeaderText="DateLogged" 
                    SortExpression="DateLogged" />
                <asp:BoundField DataField="DateUpdated" HeaderText="DateUpdated" 
                    SortExpression="DateUpdated" />
                <asp:BoundField DataField="Status" HeaderText="Status" 
                    SortExpression="Status" />
                <asp:BoundField DataField="Priority" HeaderText="Priority" 
                    SortExpression="Priority" />
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:BoundField DataField="Surname" HeaderText="Surname" 
                    SortExpression="Surname" />
                <asp:BoundField DataField="SkillGroupID" HeaderText="SkillGroupID" 
                    SortExpression="SkillGroupID" />
                <asp:BoundField DataField="SkillGroup" HeaderText="SkillGroup" 
                    SortExpression="SkillGroup" />
                <asp:BoundField DataField="Expr1" HeaderText="Expr1" SortExpression="Expr1" />
                <asp:BoundField DataField="Expr2" HeaderText="Expr2" SortExpression="Expr2" />
                <asp:BoundField DataField="NoteID" HeaderText="NoteID" 
                    SortExpression="NoteID" />
                <asp:BoundField DataField="ResolutionID" HeaderText="ResolutionID" 
                    SortExpression="ResolutionID" />
            </Columns>
        </asp:GridView>   

这是我SqlDataSource的表格加入和过滤技能组列的下拉列表

 <asp:SqlDataSource ID="ProblemDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
        SelectCommand="SELECT p.ProblemID, p.CustomerID, p.Summary, p.DateLogged, p.DateUpdated, s.Status, pr.Priority, t.Name, t.Surname, sg.SkillGroupID, sg.SkillGroup, ho.Name AS Expr1, ho.Surname AS Expr2, p.NoteID, p.ResolutionID FROM Problem AS p LEFT OUTER JOIN Status AS s ON p.StatusID = s.StatusID INNER JOIN HelpdeskOperator AS ho ON p.HelpdeskID = ho.HelpdeskID LEFT OUTER JOIN Priority AS pr ON p.PriorityID = pr.PriorityID LEFT OUTER JOIN [Skill Group] AS sg ON p.SkillGroupID = sg.SkillGroupID INNER JOIN Technician AS t ON p.ProblemID = t.ProblemID AND s.StatusID = t.StatusID AND pr.PriorityID = t.PriorityID WHERE ([SkillGroup] = @SkillGroup) " 
        <FilterParameters>
            <asp:Parameter Name="newparameter" />
        </FilterParameters>
        <InsertParameters>
            <asp:Parameter Name="SkillGroup" />
        </InsertParameters>
        <SelectParameters>
            <asp:ControlParameter ControlID="DropDownList1" Name="SkillGroup" 
                PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:SqlDataSource>

我还发布了一个指向屏幕截图的链接,显示了下面的问题

http://helios.hud.ac.uk/u0356716/Helpdesk.html

有人可以给我建议,因为它已经困扰了我一段时间。

先感谢您

4

1 回答 1

1

您已经通过以下方式定义了 DropDownList:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
     DataSourceID="ProblemDataSource" DataTextField="SkillGroup" 
     DataValueField="SkillGroup">
       <asp:ListItem Selected="True">Hardware</asp:ListItem>
       <asp:ListItem Selected="True">Software</asp:ListItem>
       <asp:ListItem Selected="True">Network</asp:ListItem>
 </asp:DropDownList>

首先,您不能选择所有项目。只有硬件将被选中,因为它是列表中的第一个。

这导致了您的第二个问题;

然后运行的查询是(为了简洁而减少):

SELECT blah
FROM Tables
 WHERE ([SkillGroup] = @SkillGroup) 

当然,这将Hardware在您上面的示例中。

所以你只会得到类型的技能组Hardware。由于它是下拉列表的数据源,因此您只会在列表中获得“硬件”。

另请注意,您会得到 Hardware两次。这是因为您有两条记录,其中的 SkillGroup 为 Hardware。

从这里开始,您有几个选择。您可以不使下拉列表数据绑定:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">
     <asp:ListItem>Hardware</asp:ListItem>
     <asp:ListItem>Software</asp:ListItem>
     <asp:ListItem>Network</asp:ListItem>
</asp:DropDownList>

或者您可以将 DropDownList 绑定到另一个数据源,该数据源只运行查询:

SELECT DISTINCT SkillGroup FROM [Skill Group]

更新:

对于您问题的第二部分,您可以使用 SqlDataSource 的FilterParameters部分;

<asp:SqlDataSource ID="ProblemDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
        SelectCommand="YOUR QUERY WITHOUT THE WHERE CLAUSE"
        FilterExpression="SkillGroup='{0}'"> 
        <FilterParameters>
             <asp:ControlParameter 
                 Name="SkillGroup" 
                 ControlID="DropDownList1" 
                 PropertyName="SelectedValue" />
        </FilterParameters>
    </asp:SqlDataSource>

确保你只DataBindDropDownList1 一次,在 Page_Init 或类似的,不要每次都重建它(检查!Page.IsPostBack

但是,如果您想每次都查询数据源(这对于大型数据集更有效),那么我怀疑这里的问题是您的 DropDownList 值正在被每个 PostBack 清除。你是怎么打电话DataBind给 DropDownList 的,你还记得!Page.IsPostBack吗?

于 2013-06-15T12:48:43.147 回答