2016-11-03 10 views
0

У меня есть два раскрывающихся списка в окне просмотра подробностей, называемом College, а другое - Department. Если пользователь выбирает колледж, выпадающий список отдела должен генерировать все отделы для выбранного колледжа.Изменение списка раскрывающихся списков в зависимости от другого раскрывающегося списка в подробном представлении ASP.NET

Вот DetailsView и списки Выпадающие:

<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="600px" AutoGenerateRows="False" CssClass="table table-bordered mtop" DataKeyNames="ID" DataSourceID="SqlDataSource1" OnDataBound="DetailsView1_DataBound"> 
       <FieldHeaderStyle CssClass="DetailsViewHeader" Width="200px" /> 
       <Fields> 

        <asp:TemplateField HeaderText="College" SortExpression="Colleges"> 
         <EditItemTemplate> 
          <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource3" DataTextField="ArName" DataValueField="Code"></asp:DropDownList> 
          <asp:HiddenField ID="HiddenColl" runat="server" value='<%# Eval("Colleges") %>' /> 
         </EditItemTemplate> 
         <ItemTemplate> 
          <asp:Label ID="Label15" runat="server" Text='<%# Bind("Colleges") %>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 

        <asp:TemplateField HeaderText="Department" SortExpression="ArName"> 
         <EditItemTemplate> 
          <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2" DataTextField="ArName" DataValueField="Code"></asp:DropDownList> 
          <asp:HiddenField ID="HiddenDep" runat="server" value='<%# Eval("ArName") %>' />      
         </EditItemTemplate> 
         <ItemTemplate> 
          <asp:Label ID="Label11" runat="server" Text='<%# Bind("ArName") %>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 

        <asp:TemplateField ShowHeader="False"> 
         <EditItemTemplate> 
          <asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Update" Text="Update" /> 
          &nbsp;<asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" /> 
         </EditItemTemplate> 
         <ItemTemplate> 
          <asp:Button ID="Button1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" /> 
          &nbsp;<asp:Button ID="btnDelete" runat="server" CausesValidation="False" Text="Delete" OnClientClick="return confirm('Do you want to delete ?');" OnClick="btnDelete_Click" /> 
         </ItemTemplate> 
         <ControlStyle CssClass="btn-login" /> 
         <ItemStyle CssClass="text-center" /> 
        </asp:TemplateField> 

      </Fields> 
     </asp:DetailsView> 

Вот это SqlDataSources:

<asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:UEDConnectionStringMarwaMarwa %>" SelectCommand="SELECT [ArName], [Code] FROM [College]"></asp:SqlDataSource> 

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:UEDConnectionStringMarwaMarwa %>" SelectCommand="SELECT [Code], [ArName] FROM [Department] WHERE ([CollegeCode] = @CollegeCode)"> 
       <SelectParameters> 
        <asp:ControlParameter ControlID="DetailsView1$DropDownList2" Name="CollegeCode" PropertyName="SelectedValue" Type="Int32" /> 
       </SelectParameters> 
</asp:SqlDataSource> 

Это сообщение об ошибке:

Не удалось найти контроль «DetailsView1 $ DropDownList2 'в ControlParameter' CollegeCode '

Я сделал это DetailsView1$DropDownList2, чтобы он мог получить доступ к раскрывающийся список, который находится внутри DetailsView

В чем проблема?

+0

Установите Autopostback = true в свой первый раскрывающийся список, и вам может потребоваться иметь встроенный источник данных внутри шаблона элемента редактирования. – Nikki9696

+0

Также это выглядит как хороший чистый пример каскадных выпадающих списков для элементов управления шаблонами http://stackoverflow.com/questions/6749944/implementation-cascading-dropdownlist-binding-in-a-templated-control – Nikki9696

ответ

0

Я не знаком с DetailsView и не знаком с SqlDataSource, но я постараюсь помочь.

По моему опыту, я узнал, что вы не должны пытаться принять ClientID элемента управления. Итак, сначала я бы рекомендовал получить ClientID с сервера. Используя выражение рядного, я хотел бы попробовать что-то вроде этого:

<asp:ControlParameter ControlID='<%= DetailsView1.Rows(0).FindControl("DropDownList2").ClientID %>' Name="CollegeCode" PropertyName="SelectedValue" Type="Int32" /> 

Более подробной информации о asp.net строковых выражений см Introduction to ASP.NET inline expressions in the .NET Framework.

Поскольку я не знаком с элементом управления DetailsView, я не знаю, будет ли строка с индексом 0 в DetailsView, когда она выполнит это встроенное выражение (которое вызовет исключение).

Если этот код не работает, я хотел бы предложить динамически установки ControlID на заднем конце, который выполняется после того, как DetailsView1 строки связаны (например, внутри метода DataBound случае, если DetailsView1 «ы).

VB:

If DetailsView1.Rows.Count > 0 Then 
    Dim objDropDownList2 as Control = DetailsView1.Rows(0).FindControl("DropDownList2") 
    If objDropDownList2 IsNot Nothing Then 
     SqlDataSource1.SelectParameters("CollegeCode").ControlID = objDropDownList2.ClientID 
    End If 
End If 

C#:

if (DetailsView1.Rows.Count > 0) { 
    Control objDropDownList2 = DetailsView1.Rows(0).FindControl("DropDownList2"); 
    if (objDropDownList2 != null) { 
     SqlDataSource1.SelectParameters("CollegeCode").ControlID = objDropDownList2.ClientID; 
    } 
} 

Я надеюсь, что это помогает!

+0

Спасибо, но не работал – Marwa

 Смежные вопросы

  • Нет связанных вопросов^_^