我在ASP.NET(VB)页面上有一个详细信息视图,其中列出了客户的详细信息(他们的姓名,地址等)。
“国家/地区”选项是从数据库表中提取的下拉列表。这一切都可以在查看详细信息视图时正常工作,您可以看到他们所在的国家/地区。
但是,当我单击DetailsView上的“编辑”按钮时,下拉列表会正确显示db表中的所有可用国家/地区,但它没有选定的值,因此它不是选择当前设置的国家/地区,而是默认到列表中的顶部。这是错误的,因为它不是他们当前设定的值。
使用代码隐藏(VB),我该如何将下拉列表的选定值设置为他们当前设置的国家/地区名称?在代码隐藏中,我已经读取了它们当前的国家名称并将其存储在名为strCurrentCountryName
例如
Response.Write "strCurrentCountryName: " & strCurrentCountryName
将显示:
strCurrentCountryName: United Kingdom
所以我现在需要将他们的strCurrentCountryName
值与下拉列表中的一个国家/地区名称相匹配,并将其设置为它们的SelectedValue。
我的代码在前面(列出了数据库中的所有国家/地区):
<asp:TemplateField HeaderText="Country" SortExpression="address5">
<EditItemTemplate>
<asp:SqlDataSource ID="SqlDataSourcecountryList" runat="server" ConnectionString="<%$ ConnectionStrings:PDConnectionString %>"
ProviderName="<%$ ConnectionStrings:PDConnectionString.ProviderName %>"
SelectCommand="SELECT country_name_short, country_name_long FROM country_list WHERE deleted = 0 ORDER BY country_name_long">
</asp:SqlDataSource>
<asp:DropDownList ID="DropDownListCountry" runat="server" CssClass="form-control"
DataSourceID="SqlDataSourcecountryList" DataTextField="country_name_long" DataValueField="country_name_short">
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("address5") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
在代码隐藏中,我尝试了这个(在Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
内):
DropDownListCountry.DataBind()
DropDownListCountry.Items.FindByText(strCurrentCountryName).Selected = True
其中包含以下错误消息:
'DropDownListCountry' is not declared. It may be inaccessible due to its protection level
我尝试使用这两行代码,将下拉列表放在EditItemTemplate的OUTSIDE中,它完美运行:
DropDownListCountry.DataBind()
DropDownListCountry.Items.FindByText(strCurrentCountryName).Selected = True
果然,它确实将他们的选定值正确设置为正确的国家。
在我的代码隐藏(vb)中,我是否需要以某种方式首先声明DropDownListCountry
?
当我把它放在我的asp:TemplateField的EditItemTemplate中时,如何才能完成这项工作?
答案 0 :(得分:1)
由于下拉列表位于模板内部,因此不会在页面代码中的任何位置静态声明,因此无法仅通过DropDownListCountry
直接引用它。考虑一下 - 如果这是可能的,并且你有一个带有这些的网格视图模板,请在下一行中引用哪一行?
所以实际上这个下拉列表会根据它所在的容器模板分配不同的ID。所以你需要在数据绑定时间内在模板中找到它,然后按照你的方式设置所选的值:
Dim ddl As DropDownList = CType(detailsViewId.FindControl("DropDownListCountry"), DropDownList)
ddl.Items.FindByText(strCurrentCountryName).Selected = True
重要的是确保在创建下拉控件后运行此代码。最合适的地方是数据绑定发生后。为此,请订阅DataBound
事件:
<asp:DropDownList ID="DropDownList1" runat="server" OnDataBound="DropDownList1_DataBound">
并在事件处理程序中运行代码:
Protected Sub DropDownList1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
' Code above goes here
End Sub