Elatesummer
Elatesummer

Reputation: 313

visual basic asp.net dropDownList not populating with values

I have an asp.net Visual Basic web site, and I am using a stored procedure to get values to populate a drop-down list.

However, I have two issues. If I put the method to fill the drop-down list within my If Not IsPostBack statement in the page load event, then the whole list is filled with items saying 'System.Data.DataViewRow' instead of the actual values. If I put it outside this 'if' statement but still in my page load event, I get the correct values, but no matter what I select, when I leave the drop-down it reverts back to the top item instead of the selected item.

What am I doing wrong??

Edit: I have now added the DataTextField as suggested by Nic and put the method inside my 'If Not IsPostBack' event as suggested by Lee Bailey. However, my drop-down is still showing all values as 'System.Data.DataViewRow' so I don't know if Lee's solution has worked or not! Any other ideas on the issue of showing the values! I have updated my code below to reflect the changes.

The visual basic:

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

The markup:

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

The SQL procedure returns a two-column dataset with 'regionID' as column 1, and 'regionName' as column2.

I've spent about two days on this now, trying various things and reading all the books I can! I have never had this issue in C# when I have performed the same operation and I cannot for the life of me think what I've missed in the VB...

Upvotes: 1

Views: 3901

Answers (2)

Ric
Ric

Reputation: 13248

It does not look as though you are setting the DataTextField property of your DropDownList:

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

source: MSDN DataTextField

Upvotes: 2

Lee Bailey
Lee Bailey

Reputation: 3624

It's reverting back to the original value because you are re-binding the values to the dropdown after a postback. Changing the selected item is triggering a postback because you have the AutoPostBack property set to true. I would call drpRegion_fill() only if it's not a postback. Setting the DataTextField as Ric mentioned should solve the problem regarding 'System.Data.DataViewRow'

Upvotes: 1

Related Questions