[英]Cascading DropDownList binding in ASP.Net DetailsView templated control not working
[英]Implementing cascading DropDownList binding in a asp.net detailsview templated control
我在asp.net detailview中有兩個下拉列表“ 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
背后的代碼:
私有子DetailsDetail1_ItemInserting(作為對象發送,作為DetailsViewInsertEventArgs發送)處理dvSMasterCurrentYear.ItemInserting
昏暗的ddPlantHatch作為DropDownList = TryCast(view.FindControl(“ ddPlantingHatchery”),DropDownList)e.Values.Add(“ HatcheryCodePlant”,ddPlantHatch.SelectedValue)
Dim ddCatNum作為DropDownList = TryCast(view.FindControl(“ ddCatalogName”),DropDownList)e.Values(“ HatcheryCodePlant”)= DirectCast(DirectCast(sender,DetailsView).FindControl(“ ddPlantingHatchery”),DropDownList).SelectedValue
謝謝
只要您的GetCatalogNames方法正常工作,您可能要做的就是將autopostback="true"
添加到您的第一個下拉列表中。
同樣,您的codebehind方法在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
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.