Ошибка при попытке отфильтровать выпадающий список со значением поля Gridview через параметр управления - PullRequest
0 голосов
/ 23 июня 2010

Я получаю страшное У 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>

Действительно не вижу, что я делаю неправильно.Если я не использую «Выбрать параметр» и просто «выбрать имя сотрудника из сотрудника», тогда весь список сотрудников отображается нормально.Как только я пытаюсь использовать контрольный параметр, он падает.Помогите!:)

Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 23 июня 2010

Я думаю, что проблема в том, что ваш SqlDataSource, который возвращает список сотрудников для отдела, не возвращает никаких строк, и я думаю, что это потому, что ControlParameter не прав.Несмотря на то, что вы сделали правильную вещь, указав его на Rotas GridView и свойство SelectedValue, в свойстве DataKeyNames используются три поля (DateFrom, DateTo, DepartmentId), и я полагаю, что в настоящий момент вы передаете значение DateFrom взапрос - следовательно, никаких результатов.Я думаю, что вам нужно использовать в PropertyName элемента ControlParameter вместо свойства SelectedValue Rotas - SelectedDataKey - здесь есть подробности о MSDN здесь , хотя демонстрационный код там не особенно полезен.Однако важная строка:

Если вы создаете объект ControlParameter и хотите получить доступ к ключевому полю, отличному от первого поля, используйте индексированное свойство SelectedDataKey в свойстве PropertyName объекта ControlParameter

Итак, я думаю, что вам нужно:

<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>

Без копии ваших данных я не могу проверить это, но попробуйте и посмотрите, что вы получите...

...