如何使用代码隐藏在DetailsView内的EditItemTemplate中设置DropDownList的Selected Value?

时间:2016-07-08 13:42:48

标签: asp.net vb.net

我在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中时,如何才能完成这项工作?

1 个答案:

答案 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