我有一个 asp.net Visual Basic 网站,我正在使用存储过程来获取值以填充下拉列表。
但是,我有两个问题。如果我将填充下拉列表的方法放在页面加载事件中的 If Not IsPostBack 语句中,则整个列表将填充“System.Data.DataViewRow”而不是实际值的项目。如果我把它放在这个'if'语句之外但仍然在我的页面加载事件中,我会得到正确的值,但无论我选择什么,当我离开下拉菜单时,它会恢复到顶部项目而不是所选项目.
我究竟做错了什么??
编辑:我现在按照 Nic 的建议添加了 DataTextField,并按照 Lee Bailey 的建议将该方法放在我的“If Not IsPostBack”事件中。但是,我的下拉菜单仍将所有值显示为“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 中错过了什么......