【问题标题】:Error trying to filter drop down list with a Gridview field value via a controlparameter尝试通过控制参数过滤带有 Gridview 字段值的下拉列表时出错
【发布时间】:2011-03-07 05:40:17
【问题描述】:

我得到了可怕的 'DropDownList1' 有一个无效的 SelectedValue,因为它不存在于项目列表中。 参数名称:值 尝试使用其他绑定字段值之一过滤模板字段中的下拉列表时出错(我正在尝试根据其部门获取员工列表 - 即用户可以更改员工但仅限于同一部门的其他成员)。

代码如下:

<asp:GridView ID="Rotas" runat="server" AllowSorting="True"
DataSourceID="SqlDataSource3" AutoGenerateEditButton="True"  DataKeyNames="DateFrom,DateTo,DepartmentId"
    AutoGenerateColumns="False" OnRowUpdating="Rotas_RowUpdating">
    <Columns>
        <asp:BoundField DataField="DateFrom" HeaderText="DateFrom" ReadOnly="True" 
            SortExpression="DateFrom" />
        <asp:BoundField DataField="DateTo" HeaderText="DateTo" ReadOnly="True" 
            SortExpression="DateTo" />                
        <asp:TemplateField HeaderText="Employee Name" SortExpression="EmployeeName">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList1" runat="server" 
                    DataSourceID="SqlDataSource4" DataTextField="EmployeeName" 
                    DataValueField="EmployeeName" SelectedValue='<%# Bind("EmployeeName") %>'>
                </asp:DropDownList>
            </EditItemTemplate>
            <ItemTemplate>

                </asp:DropDownList>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("EmployeeName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="DepartmentId" HeaderText="DepartmentId" 
            ReadOnly="True" SortExpression="DepartmentId" />
        <asp:BoundField DataField="EmployeeId" HeaderText="EmployeeId" ReadOnly="False" 
            SortExpression="EmployeeId" />
    </Columns>
</asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource3" runat="server" 
        ConnectionString="<%$ ConnectionStrings:OnCallRotaConnectionString %>" 
        SelectCommand="SELECT r.DateFrom, r.DateTo, e.EmployeeName, e.EmployeeId, r.departmentid  
FROM  
           dbo.[Rota] r INNER JOIN
           dbo.[Employee] AS e ON r.EmployeeId = e.EmployeeId
WHERE (r.DateTo >= GETDATE()) " 
        UpdateCommand="UPDATE [Rota] SET [EmployeeId] = (select employeeid from employee where employeename = @EmployeeName),
        [departmentid] = (select departmentid from employee where employeename = @EmployeeName)
         WHERE [DateFrom] = @DateFrom AND [DateTo] = @DateTo AND [DepartmentId] = @DepartmentId">

        <UpdateParameters>
            <asp:Parameter Name="DateTo" Type="DateTime" />
            <asp:Parameter Name="DateFrom" Type="DateTime" />
            <asp:Parameter Name="DepartmentId" Type="Int16" />
            <asp:Parameter Name="EmployeeId" Type="Int16" />
            <asp:Parameter Name="EmployeeName" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>
</p>
<asp:SqlDataSource ID="SqlDataSource4" runat="server" 
    ConnectionString="<%$ ConnectionStrings:OnCallRotaConnectionString %>" 
    onselecting="SqlDataSource4_Selecting" 
    SelectCommand="SELECT [EmployeeName] FROM [Employee] where DepartmentId=@DepartmentId"
    >
    <SelectParameters>
      <asp:ControlParameter ControlID="Rotas" Name="DepartmentId" 
            PropertyName="SelectedValue" Type="Int16" />               
    </SelectParameters>
</asp:SqlDataSource>

真的看不出我做错了什么。如果我不使用“选择参数”而只使用“从员工中选择员工姓名”,那么整个员工列表都可以正常显示。一旦我尝试使用控制参数,它就会倒下。帮助! :)

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: asp.net gridview sqldatasource controlparameter


    【解决方案1】:

    我认为问题在于返回部门员工列表的 SqlDataSource 没有返回任何行,我认为这是因为 ControlParameter 不正确。尽管您通过将其指向 Rotas GridView 和 SelectedValue 属性做了正确的事情,但 DataKeyNames 属性中使用了三个字段(DateFrom、DateTo、DepartmentId),我相信您当前正在将 DateFrom 值传递到您的查询 - 因此,没有结果。 我认为您需要在 ControlParameter 的 PropertyName 而不是 Rotas 的 SelectedValue 属性中使用 SelectedDataKey - MSDN here 上有详细信息,尽管那里的演示代码不是特别有用。然而重要的一行是:

    如果您正在创建 ControlParameter 对象并想要访问关键字段 除了第一个字段,使用 索引 SelectedDataKey 属性 的 PropertyName 属性 控制参数对象

    所以我认为你需要的是:

    <asp:SqlDataSource ID="SqlDataSource4" runat="server" 
    ConnectionString="<%$ ConnectionStrings:OnCallRotaConnectionString %>" 
    onselecting="SqlDataSource4_Selecting" 
    SelectCommand="SELECT [EmployeeName] FROM [Employee] where DepartmentId=@DepartmentId"
    >
    <SelectParameters>
      <asp:ControlParameter ControlID="Rotas" Name="DepartmentId" 
            PropertyName="SelectedDataKey[2]" Type="Int16" />               
    </SelectParameters>
    </asp:SqlDataSource>
    

    如果没有您的数据副本,我无法对其进行测试,但请试一试,看看您会得到什么...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多