0

我有一个 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 中错过了什么......

4

2 回答 2

2

它看起来不像您正在设置 DropDownList 的 DataTextField 属性:

 With drpRegion
        .DataSource = drpRegionDs
        .DataValueField = "regionName"
        .DataTextField = "fieldToDisplayAsText"
        .SelectedIndex = 0
        .DataBind()
 End With

来源: MSDN DataTextField

于 2013-06-21T14:15:12.067 回答
1

它正在恢复为原始值,因为您在回发后将值重新绑定到下拉列表。更改所选项目会触发回发,因为您将 AutoPostBack 属性设置为 true。只有当它不是回发时,我才会调用 drpRegion_fill()。将 DataTextField 设置为 Ric 提到的应该可以解决有关“System.Data.DataViewRow”的问题

于 2013-06-21T14:18:15.960 回答