Реализация каскадной привязки DropDownList в шаблонном элементе управления asp.net detailsview

У меня есть два раскрывающихся списка в подробном обзоре asp.net «PlantingHatchery» и «CatalogNames». Результаты первого определяют значения во втором. Первый отлично подходит, но не второй. Я просмотрел несколько предложений, но ни один из них не работает для меня. Где я ошибаюсь?

Вот соответствующий код:

 <asp:DetailsView ID="dvSMasterCurrentYear" runat="server" AutoGenerateRows="False" align="center" DataKeyNames="SMasterid" DataSourceID="SqlDataSource1" 
        Height="50px" Width="437px" AutoGenerateInsertButton="True" AllowPaging="True" insertcommand =" Insert Into [SMasterCurrentYear}
        ([HatcheryCodePlant],[CatalogNo],[DataPlant],[TimePlant],[SpeciesCode],[BroodYear],[SizeCode],[MethodCode],[Length], [PoundFish],[NumberPlanted],[NumberPerLB],[HaulMort],
        [License], [ActSites], [HatcheryCodeRear],[Comments],[H20Temp],[ConsOfficer],[TankTemp],[Marks],[Raceway])
        Values (@HatcheryCodePlant, @CatalogNum, @DataPlant, @TimePlant, @SpeciesCode, @BroodYear, @SizeCode, @MethodCode, @Length, @PoundFish, @NumberPlanted, @NumberPerLB, 
        @HaulMort, @License, @ActSites, @HatcheryCodeRear, @Comments, @H20Temp, @ConsOfficer, @TankTemp, @Marks, @Raceway) " Font-Bold="True" BackColor="#FFCC99" Font-Size="Medium" DefaultMode="Insert">
        <AlternatingRowStyle BackColor="#99FFCC" />

enter code here

              <asp:TemplateField HeaderText="Planting Hatchery">
                    <ItemTemplate>
                        <asp:Label ID="lblPlantHatch" runat="server" Text='<%# Eval("HatcheryCodePlant")%>' Visible = "true"></asp:Label>
                    </ItemTemplate>
                   <insertItemTemplate>
                        <asp:DropDownList ID="ddPlantingHatchery" runat="server" DataSource='<%# GetPlantingHatchery()%>' 
                        DataTextField="HatcheryNamePlant" DataValueField="HatcheryCodePlant" width= "150" AppendDataBoundItems="true"> 
                       <asp:ListItem Text="Select" Value="" />
                    </asp:DropDownList>
                 </insertItemTemplate>
<asp:TemplateField HeaderText="Water Body Name">
                   <ItemTemplate>
                    <asp:Label ID="lblStreamName" runat="server" Text='<%# Eval("CatalogNo")%>' Visible = "true"></asp:Label>
                </ItemTemplate>
                 <insertItemTemplate>
                    <asp:DropDownList ID="ddCatalogName" runat="server" DataSource='<%# GetCatalogNames()%>' 
                        DataTextField="StreamName" DataValueField="CatalogNo" AppendDataBoundItems="true"> 
                       <asp:ListItem Text="Select" Value="" />
                    </asp:DropDownList>
                       <asp:ObjectDataSource ID="dsWaterBody" runat="server" TypeName="StreamName"
                        SelectMethod="GetCatalogNames">
                        <SelectParameters>
                            <%--<asp:Parameter Name="HatcheryCodetName"  Type="string" />--%>
                            <asp:ControlParameter Name="HatcheryCodePlant" Type="Int32" ControlID="ddPlantingHatchery" PropertyName="SelectedValue"/>
                        </SelectParameters>
                    </asp:ObjectDataSource>
                </insertItemTemplate>enter code here

Код позади:

Private Sub DetailsView1_ItemInserting (отправитель как объект, e As DetailsViewInsertEventArgs) Обрабатывает dvSMasterCurrentYear.ItemInserting

Dim ddPlantHatch As DropDownList = TryCast (view.FindControl ("ddPlantingHatchery"), DropDownList) e.Values.Add ("HatcheryCodePlant", ddPlantHatch.SelectedValue)

Dim ddCatNum As DropDownList = TryCast (view.FindControl ("ddCatalogName"), DropDownList) e.Values ​​("HatcheryCodePlant") = DirectCast (DirectCast (отправитель, DetailsView). DropControl ("ddPlantingHatcheryListue"),.

Спасибо


person jim davis    schedule 04.08.2015    source источник


Ответы (1)


Если ваш метод GetCatalogNames работает правильно, все, что вам может понадобиться, это добавить autopostback="true" в первое раскрывающееся меню.

Кроме того, ваш метод выделенного кода запускается во время ItemInserting, что в данном случае является значением по умолчанию. Но может и не понадобиться.

Если это не сработает, вы должны настроить свой метод так, чтобы он запускал OnSelectedIndexChanged вашего первого раскрывающегося списка. Сделать это:

Добавьте это в свой первый раскрывающийся список:

    <asp:DropDownList ID="ddPlantingHatchery" runat="server" DataSource='<%# GetPlantingHatchery()%>' 
                    DataTextField="HatcheryNamePlant" DataValueField="HatcheryCodePlant" width= "150" AppendDataBoundItems="true" AutoPostBack="true" OnSelectedIndexChanged="ddPlantingHatchery_indexchanged"> 
                   <asp:ListItem Text="Select" Value="" />
                </asp:DropDownList>

затем добавьте этот метод в CodeBehind:

Public Sub ddPlantingHatchery_indexchanged(sender As Object, e As EventArgs)
    Dim ddCatNum As DropDownList = TryCast(dvSMasterCurrentYear.FindControl("ddCatalogName"), DropDownList)
    ddCatNum.SelectedValue = TryCast(dvSMasterCurrentYear.FindControl("ddPlantingHatchery"), DropDownList).SelectedValue
End Sub

Этот примерный метод просто установит SelectedValue для ddCatNum на SelectedValue для ddPlant. Конечно, вы можете изменить это, чтобы вместо этого получать значения, которые вы определили в своем методе ObjectDataSource.

Другой подход: добавьте autopostback="true" в первое раскрывающееся меню и измените функцию GetCatalognames (), чтобы она возвращала другое значение на основе обратной передачи, примерно так:

    Public Function GetCatalogNames() As DataSet
    If Page.IsPostBack Then
        Dim ddPlantHatch As DropDownList = TryCast(dvSMasterCurrentYear.FindControl("ddPlantingHatchery"), DropDownList)

        Dim myConnection As New SqlConnection(ConnectionString)
        Dim ad As New SqlDataAdapter("SELECT StreamName, CatalogNo, " _
                                      + "HatcheryNamePlant, HatcheryCodePlant, " _
                                      + "LLID FROM vwStockingWatersByHatchery " _
                                      + "where HatcherCodePlant = " + ddPlantHatch.SelectedValue _
                                      + " Order By StreamName", myConnection)
        Dim dsWaterBody As New DataSet()
        ad.Fill(dsWaterBody, "Catalog")
        Return dsWaterBody
    Else


        Dim myConnection As New SqlConnection(ConnectionString)
        Dim ad As New SqlDataAdapter("SELECT StreamName, CatalogNo, " _
                           + "HatcheryNamePlant, HatcheryCodePlant, " _
                           + "LLID FROM vwStockingWatersByHatchery " _

                           + "Order By StreamName", myConnection)
        Dim dsWaterBody As New DataSet()
        ad.Fill(dsWaterBody, "Catalog")
        Return dsWaterBody
    End If


End Function

Надеюсь это поможет

person BasicIsaac    schedule 05.08.2015
comment
Код позади дает мне правильное значение. однако это значение не передается во второй раскрывающийся список, который необходимо отфильтровать. - person jim davis; 06.08.2015
comment
Я использую это, чтобы заполнить второе раскрывающееся меню (ddCatalogNames) в коде, стоящем за: Public Function GetCatalogNames () As DataSet Dim myConnection As New SqlConnection (ConnectionString) Dim ad As New SqlDataAdapter (SELECT StreamName, CatalogNo, HatcheryNamePlant, HatcheryCodeingPlant Упорядочить по StreamName, myConnection) Dim dsWaterBody As New DataSet () ad.Fill (dsWaterBody, Catalog) Возвращает функцию конца dsWaterBody, и это стыкуется с заполнением списка при загрузке страницы - person jim davis; 06.08.2015
comment
Проблема возникает, когда страница загружает все мои функции Get, поэтому, когда страница появляется, все раскрывающиеся списки уже загружены. Как мне перезагрузить общедоступную функцию GetCatalogNames и привязать к ddCatalogName после запуска ddPlantingHatchery_indexchanged? Спасибо за помощь. - person jim davis; 10.08.2015