【问题标题】:Implementing cascading DropDownList binding in a asp.net detailsview templated control在 asp.net detailsview 模板化控件中实现级联 DropDownList 绑定
【发布时间】:2015-10-27 09:38:47
【问题描述】:

我在 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(sender As Object, 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(sender, DetailsView).FindControl("ddPlantingHatchery"), DropDownList).SelectedValue

谢谢

【问题讨论】:

    标签: asp.net detailsview cascadingdropdown


    【解决方案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
    

    此示例方法将简单地将 ddCatNum 的 SelectedValue 设置为 ddPlant 的 SelectedValue。当然,您可以将其更改为获取您在 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
    

    希望对你有帮助

    【讨论】:

    • 后面的代码给了我正确的值。但是,此值没有传递到需要过滤的第二个下拉列表。
    • 我用它来填充后面代码中的第二个下拉列表 (ddCatalogNames): Public Function GetCatalogNames() As DataSet 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") 返回 dsWaterBody 结束函数,这会在页面加载时填充列表跨度>
    • 问题似乎是当页面加载我的所有“获取函数”时运行,所以当页面出现时所有下拉菜单都已加载。如何在 ddPlantingHatchery_indexchanged 运行后重新加载公共函数 GetCatalogNames 并绑定到“ddCatalogName”?谢谢你的帮助。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多