【问题标题】:ASP.net DropDownList populates GridViewASP.net DropDownList 填充 GridView
【发布时间】:2011-08-21 21:25:00
【问题描述】:

我正在尝试设置 GridView 来过滤属于特定员工的凭据。下拉列表提供员工列表,一旦选中,我希望 gridview 仅填充属于特定员工的条目。

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:DropDownList ID="DropDownListEmployee" runat="server"  
                      AutoPostBack="True" 
                      OnSelectedIndexChanged="SelectionHasChanged"
                      DataSourceID="SqlDataSource2" DataTextField="Fullname"
                      DataValueField="Employee_ID" AppendDataBoundItems="true"
                      Width="214px">
        <asp:ListItem>Select</asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                       ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" 
                       SelectCommand="SELECT Employee.F_Name + ' ' + Employee.L_Name AS Fullname, Employee.Primary_Address, Employee.Primary_Phone, Employee.E_mail, Credentials.Degree, Credentials.Years_Experience, Credentials.Certifications, Credentials.Positions, Employee.Employee_ID FROM Employee INNER JOIN Credentials ON Employee.Employee_ID = Credentials.Employee_ID"></asp:SqlDataSource>
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                  DataSourceID="SqlDataSource2" DataKeyNames="Employee_ID">
        <Columns> 
            <asp:BoundField DataField="Fullname" HeaderText="Fullname" 
                            ReadOnly="True" SortExpression="Fullname" />
            <asp:BoundField DataField="Primary_Address" HeaderText="Primary_Address" 
                            SortExpression="Primary_Address" />
            <asp:BoundField DataField="Primary_Phone" HeaderText="Primary_Phone" 
                            SortExpression="Primary_Phone" />
            <asp:BoundField DataField="E_mail" HeaderText="E_mail" 
                            SortExpression="E_mail" />
            <asp:BoundField DataField="Degree" HeaderText="Degree" 
                            SortExpression="Degree" />
            <asp:BoundField DataField="Years_Experience" HeaderText="Years_Experience" 
                            SortExpression="Years_Experience" />
            <asp:BoundField DataField="Certifications" HeaderText="Certifications" 
                            SortExpression="Certifications" />
            <asp:BoundField DataField="Positions" HeaderText="Positions" 
                            SortExpression="Positions" />
            <asp:BoundField DataField="Employee_ID" HeaderText="Employee_ID" 
                            InsertVisible="False" ReadOnly="True" 
                            SortExpression="Employee_ID" />
        </Columns>
    </asp:GridView>
</asp:Content>

【问题讨论】:

    标签: asp.net gridview filter drop-down-menu


    【解决方案1】:

    你没有说你当前的代码会发生什么,但我敢打赌,当你选择一个员工时,页面会重新加载,你会得到一个数据库中所有员工的列表,对吧?

    如果这是真的,原因是同一个 SqlDataSource 绑定到您的 DropDownList 和 GridView,并且 SqlDataSource 的 Select 命令检索所有员工 - 没有 WHERE 条件来选择所需的员工。

    我将使用 2 个 SqlDataSource - 一个用于 DropDownList,一个用于 GridView。第二个 SqlDataSource 将有一个 Select 命令来根据 DropDownList 中的选择获取所需员工的信息。

    您可以修改 SqlDataSource2 的 SelectCommand 以仅返回 fullname 和 EmployeeID 字段,因为 DropDownList 不需要其余字段:

    <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
        <asp:DropDownList ID="DropDownListEmployee" runat="server"  
                          AutoPostBack="True" 
                          OnSelectedIndexChanged="SelectionHasChanged"
                          DataSourceID="SqlDataSource2" DataTextField="Fullname"
                          DataValueField="Employee_ID" AppendDataBoundItems="true"
                          Width="214px">
            <asp:ListItem>Select</asp:ListItem>
        </asp:DropDownList>
        <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                           ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" 
                           SelectCommand="SELECT F_Name + ' ' + L_Name AS Fullname, Employee_ID FROM Employee"></asp:SqlDataSource>
    

    在您的第二个 SqlDataSource 中,您需要向 SelectParameters 集合添加一个参数 (EmployeeID),如下所示,并更新您的 SelectCommand 以获取该参数。

        <asp:SqlDataSource ID="gvDataSource" runat="server"
                           ConnectionString="<%$ ConnectionStrings:DBConnectionString %>"
                           SelectCommand="SELECT Employee.F_Name + ' ' + Employee.L_Name AS Fullname, Employee.Primary_Address, Employee.Primary_Phone, Employee.E_mail, Credentials.Degree, Credentials.Years_Experience, Credentials.Certifications, Credentials.Positions, Employee.Employee_ID FROM Employee INNER JOIN Credentials ON Employee.Employee_ID = Credentials.Employee_ID WHERE Employee.EmployeeID = IsNull(@EmployeeID, EmployeeID)">
            <SelectParameters>
                <asp:ControlParameter ControlID="DropDownListID" 
                     ConvertEmptyStringToNull="true" Name="EmployeeID"
                     PropertyName="SelectedValue" />
            </SelectParameters>
    

    然后将这个 SqlDataSource 分配给 GridView 而不是第一个。

    请注意,SqlDataSource 不会对提交到参数中的值进行验证 - 这可能会造成安全威胁。

    SqlDataSource.Select Method

    SqlDataSource.SelectParameters Property

    【讨论】:

    • 感谢您的帮助。很抱歉打扰您,当我尝试此操作时,我一直遇到错误:“DataBinding:'System.Data.DataRowView' 不包含名为 'Employee_ID' 的属性。”我猜这是因为我的 GridView 中没有名为 Employee_ID 的列?
    • @nick - 您在发布的标记中执行此操作。不过,它设置为 InsertVisible false。您是在尝试插入,还是只是在加载员工的信息?尝试删除 InsertVisible="false" 看看会发生什么(我理解为什么 InsertVisible="false",只是想看看潜在的问题是什么 - 你会想要保留它,所以很可能是 EmployeeID 在你的数据库是一个标识列)。
    • 得到它的工作,我不得不删除:“Select” 用于指导用户进行选择,我还必须更改查询对于 datasource1 到:“SELECT Employee_ID AS Fullname FROM Employee”,否则我会收到错误消息:“将 nvarchar 值 'Joe' 转换为数据类型 int 时转换失败。”现在留下一个数字列表(ID)。 ~ 谢谢大家的帮助,真的很感激!
    • 我的错误,我将 DataValueField 更改为 Fullname,而它应该是 Employee_ID,无论如何谢谢你的帮助! :P
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多