Home > front end >  dropdownlist selectedvalue doesnt change
dropdownlist selectedvalue doesnt change

Time:01-28

I have this dropdownlist, this one load with the data that I get from a store procedure, as you can see the load is correct, but when I change the selected value in the debug the selected value doesnt change, it stays in the first loaded value, which in this case is 1. What can I do?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim adaptador As New SqlDataAdapter
    Dim datos As New DataTable
    Dim ord As SqlDataReader


    Conexiones.AbrirConexion()
    Conexiones.Cnn.Open()

    Dim cmd As SqlCommand = New SqlCommand("sp_devolver_empresas", Conexiones.Cnn)
    cmd.CommandType = CommandType.StoredProcedure

    ord = cmd.ExecuteReader

    datos.Load(ord)

    cbEmpresas.DataSource = datos
    cbEmpresas.DataTextField = "Nombre"
    cbEmpresas.DataValueField = "Identificador"
    cbEmpresas.DataBind()

    Conexiones.Cnn.Close()

End Sub

CodePudding user response:

For EVERY web page that you build and write to the end of time?

You MUST always put the load and setup code inside of a check for post back.

every button, every drop down list, and EVERY time you click on a button or do anything, the page load will ALWAYS fire and run. Thus if you change a value, you will lose that value since the page setup and loading of say control (in this case your dropdown list) will fire EACH time - thus overwriteing.

Out of the last 100's of web pages, the FIRST thing I write is the check for postback.

So, your code should look like this:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadData
    End If

End Sub


Sub LoadData()
    Dim datos = New DataTable
    Using onexiones.Cnn
        Using cmd As SqlCommand = New SqlCommand("sp_devolver_empresas", onexiones.Cnn)
            cmd.CommandType = CommandType.StoredProcedure
            onexiones.Cnn.Open()
            datos.Load(cmd.ExecuteReader())
        End Using
    End Using

    cbEmpresas.DataTextField = "Nombre"
    cbEmpresas.DataValueField = "Identificador"
    cbEmpresas.DataSource = datos
    cbEmpresas.DataBind()

End Sub

So, only on the "real" first page load do you want to load up your grids, dropdowns etc. Remember, even a simple button dropped on to the page, and you have a click event? (the page load event fires each time - and every time). So once again, you need the IsPostBack test - and I am quite pressed to find any of my web pages that does not have this all important code stub in the on-load event.

So, remember the above rule - always setup your setup code to run on first time - not every time a button or anything else occurs on the web page. So, page load (unlike desktop) fires each and every time you do ANY operations on that page.

Also, note how I setup the data text, and value field BEFORE we give the drop down list a data source. In fact, I would suggest you put the data text, and data value field in the markup and NOT code (since then multiple different code routines can use that setting - not hard coded in code).

eg do this:

    <asp:DropDownList ID="cbEmpresas" runat="server"
        DataTextField = "Nombre"
        DataValueField = "Identificador" >
    </asp:DropDownList>

So, now your code becomes :

    cbEmpresas.DataSource = datos
    cbEmpresas.DataBind()

I suppsoe some out of habt like to set the text data settings for the dropdown list in code, but then again, in code you might want more then one palce that loads up the combo box - and thus you now have multiple places for those two settings. And better yet, you can even use the property sheet during design time to make the settings. (this is a "minor" issue, but I just perfer those settings in the markup as opposed to writing them in code for text/data settings).

At the end of the day? Just remember that golden rule: have that "test" for postback so you have a REAL first page load event code inside that if/then. In fact, you really can't even build a fnctional working web page if you break this rule. As noted, I count about 1-2 of my web pages out of 100's tht don't have that not postback code stub. It is quite much as important say compared to humans having to breathe air to function.

And why such a long post about this simple issue? Well on a near daily bases, both c# and vb.net questions are posted about how some combo box, grid view or just about anything else is "broken" and not working. And the answer 9 out of 10 times?

The developer forgot to use a Not IsPostBack code stub in their page load code.

If I was teaching asp.net, this would be the first lesson - ALWAYS use and consider the requirement for the Not IsPost back stub. You need that in 99% of your web pages. Or at the very least in ANY web page in which you have code to run on page load to setup grids, dropdowns, repeaters - don't matter what, you will NEED that code stub. So important, I often wonder if they should have create a even called first page load? It would have eliminated the daily posts and questions on SO that fail as a result of not heeding the above simple advice.

Edit: Now how to get selected value in code

Ok, now that we fixed up the code to setup the dropdown list, we now want to get in our code the value when the user makes a choice in the dropdown list.

You of course have code to fill the dropdown, BUT we also have to set autopostback = true for this dropdown.

So, say code to load:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadData
    End If

End Sub


Sub LoadData()

    Using conn As New SqlConnection(My.Settings.TEST4)
        Dim strSQL As String =
            "SELECT ID, HotelName from tblHotels ORDER BY HotelName"

        Using cmdSQL As SqlCommand = New SqlCommand(strSQL, conn)
            conn.Open()
            Dim rstData As New DataTable
            rstData.Load(cmdSQL.ExecuteReader)
            cboHotels.DataSource = rstData
            cboHotels.DataBind()
        End Using

    End Using

End Sub

And now the selected index changed event:

so, our debug output would then look like:

output:

combo selected value = 82
combo selected Text = Canadian Rocky Mountain Resorts

And as noted, make sure you set auto-post back true in the property sheet, or in the markup. The combo box for above in markup thus is this:

    <asp:DropDownList ID="cboHotels" runat="server"
        DataValueField="ID"
        DataTextField="HotelName" AutoPostBack="True">
    </asp:DropDownList>
  •  Tags:  
  • Related