我有一个asp.net Visual Basic网站,我正在使用存储过程获取值来填充下拉列表。
但是,我有两个问题。如果我把方法填充到页面加载事件中的If Not IsPostBack语句中的下拉列表中,那么整个列表将填充“System.Data.DataViewRow”而不是实际值的项目。如果我把它放在这个'if'语句之外但仍然在我的页面加载事件中,我会得到正确的值,但无论我选择什么,当我离开下拉列表时它会恢复到顶部项目而不是所选项目
我做错了什么?
编辑:我现在按照Nic的建议添加了DataTextField,并将该方法放入我的'If Not IsPostBack'事件中,如Lee Bailey所建议的那样。但是,我的下拉列表仍然显示所有值为'System.Data.DataViewRow',因此我不知道Lee的解决方案是否有效!关于显示价值问题的任何其他想法!我已更新下面的代码以反映更改。
视觉基础:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
bodyPanel.Visible = False
drpRegion_fill()
End If
End Sub
Protected Sub drpRegion_fill()
Dim sqlConn As SqlConnection
sqlConn = New SqlConnection
sqlConn.ConnectionString = ConfigurationManager.ConnectionStrings("ConnString").ConnectionString
Dim drpRegionCmd As SqlCommand
drpRegionCmd = New SqlCommand("getRegionName", sqlConn)
drpRegionCmd.CommandType = CommandType.StoredProcedure
Dim drpRegionAdp As SqlDataAdapter
drpRegionAdp = New SqlDataAdapter(drpRegionCmd)
Dim drpRegionDs As DataSet
drpRegionDs = New DataSet
sqlConn.Open()
drpRegionAdp.Fill(drpRegionDs)
With drpRegion
.DataSource = drpRegionDs
.DataBind()
.DataValueField = "regionName"
.DataTextField = "regionName"
.SelectedIndex = 0
End With
sqlConn.Close()
End Sub
标记:
<asp:Panel ID="panelRegion" runat="server" Height="160px" Width="71%" CssClass="inlineBlock">
<h2>Region:</h2>
<asp:dropDownList runat="server" AutoPostBack="true" ID="drpRegion" />
</asp:Panel>
SQL过程返回一个两列数据集,其中'regionID'为第1列,'regionName'为第2列。
我现在花了大约两天时间,尝试各种各样的东西并阅读我能做的所有书籍!当我执行相同的操作时,我从来没有在C#中遇到过这个问题,而且在我的生活中我无法想到我在VB中错过了什么......
答案 0 :(得分:2)
看起来您没有设置DropDownList的DataTextField属性:
With drpRegion
.DataSource = drpRegionDs
.DataValueField = "regionName"
.DataTextField = "fieldToDisplayAsText"
.SelectedIndex = 0
.DataBind()
End With
答案 1 :(得分:1)
它将恢复为原始值,因为您在回发后将值重新绑定到下拉列表。更改所选项目会触发回发,因为您将AutoPostBack属性设置为true。只有当它不是回发时我才会调用drpRegion_fill()。将DataTextField设置为Ric提到的应解决有关'System.Data.DataViewRow'
的问题