dynamically filled DropDownList does not retain value on postback

33,645

Solution 1

Solution moved to an answer from the question:

I finally found what the problem was. Every control was in an <asp:Table>, and I had to set EnableViewState="true" on this table in order to be able to keep the value after postback.

Solution 2

if(!IsPostBack)

 {

  populateDdl();

 }

Solution 3

put this code under this condition

if(!Page.IsPostBack)
            {

       // Your Code Here

            }

Solution 4

From your mark up you haven't set the AutoPostBack property on the second drop down. So it shouldn't fire a post back when the second drop down index has changed (unless you are programmatically causing a post back).

I've copied your code into my solution, it seems to be behaving...

<asp:Label ID="lblErr" runat="server"></asp:Label>
<asp:DropDownList ID="ddlTypePN" runat="server" EnableViewState="true"
    AutoPostBack="true" OnSelectedIndexChanged="ddlTypePN_SelectedIndexChanged"
    OnDataBound="ddlTypePN_DataBound">
</asp:DropDownList>

<asp:DropDownList runat="server" ID="ddlFctPN" AppendDataBoundItems="false" OnDataBound="ddlFctPN_DataBound">
</asp:DropDownList>

And the code...

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ListItemCollection items = new ListItemCollection();
                items.Add(new ListItem("PNT", "PNT"));
                items.Add(new ListItem("PNC", "PNC"));

                ddlTypePN.DataSource = items;
                ddlFctPN.DataBind();
                ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl

                ddlTypePN.Items.Insert(0, new ListItem("Sélectionnez...", "null"));
            }
        }

        protected void ddlTypePN_SelectedIndexChanged(object sender, EventArgs e)
        {
            string type = ddlTypePN.SelectedValue.ToString().Trim();

            // if PNT
            if (type.ToUpper().Trim().Equals("PNT"))
            {
                ddlFctPN.Enabled = true;
                populateDdl();

            }
            else if (type.ToUpper().Trim().Equals("PNC"))
            {
                ddlFctPN.Enabled = true;
                populateDdl();
            }        
        }

        protected void ddlTypePN_DataBound(object sender, EventArgs e)
        {

        }

        protected void ddlFctPN_DataBound(object sender, EventArgs e)
        {

        }

        void populateDdl()
        {

            ddlFctPN.Items.Clear();
            lblErr.Visible = false;

            try
            {
                ListItemCollection items = new ListItemCollection();
                items.Add(new ListItem("One", "1"));
                items.Add(new ListItem("Two", "2"));
                items.Add(new ListItem("Three", "3"));

                ddlFctPN.DataSource = items;
                ddlFctPN.DataBind();
            }
            catch (Exception ex)
            {
                lblErr.Text = ex.Message;
                lblErr.Visible = true;
            }


            ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null"));

        }

    }

Solution 5

you are population DD1 in every post back

to avoid this use

if(!IsPostBack)    
 {
   populateDdl();
 }
Share:
33,645
Flo
Author by

Flo

Engineer from Paris. Love dev, data and solving problems. I can help you, you can help me. ✌️ ⚽ 🏄‍♂️ 🎮 💻 🤙🏻

Updated on August 05, 2020

Comments

  • Flo
    Flo almost 4 years

    I have a form which is made to "Create a new profile". My problem is about DropDownLists.

    The first DropDown dynamically populate the second one in function of its value.

    see this picture:

    http://image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png

    And the following picture:

    http://image.noelshack.com/fichiers/2013/22/1369830738-help2.png

    You can see that my 2nd ddl ("Fonction") is correctly filled BUT when I click on the submit button, the value becomes the null value ("Sélectionnez...") and so my RequiredFieldValidator makes the page not valid!

    It seems like my 2nd DropDownList is bounded on every postback even if it's not because of SelectedIndexChanged of my 1st DropDownList. The SelectedIndexChanged of the 1st DropDownList is always called on postback and so it throws "populateDdl()" at every PostBack (if a value is selected).

    When I click on submit button, it registers a blank value in my database.

    What am I missing?

    Aspx code:

    <asp:DropDownList ID="ddlTypePN" runat="server" DataSourceID="SqlTypePN" EnableViewState="true" 
            DataTextField="libelle" DataValueField="valeur" AutoPostBack="true" OnSelectedIndexChanged="ddlTypePN_SelectedIndexChanged" 
            OnDataBound="ddlTypePN_DataBound" > </asp:DropDownList> 
    
    <asp:DropDownList runat="server" ID="ddlFctPN" AppendDataBoundItems="false" OnDataBound="ddlFctPN_DataBound" > </asp:DropDownList> 
    

    Code behind:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ddlTypeProf.DataBind(); // don't care
            ddlSsoSrc.DataBind(); // don't care
            ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl
        }
    }
    
    protected void ddlTypePN_SelectedIndexChanged(object sender, EventArgs e)
    {
        string type = ddlTypePN.SelectedValue.ToString().Trim();
        // if PNT
        if (type.ToUpper().Trim().Equals("PNT"))
        {               
            ddlFctPN.Enabled = true;
            ddlTypeAv.Enabled = true;
            rfvTypeAv.Enabled = true;
            populateDdl();
    
        }
        else if (type.ToUpper().Trim().Equals("PNC"))
        {                
            ddlFctPN.Enabled = true;
            ddlTypeAv.Enabled = false;
            rfvTypeAv.Enabled = false;
            populateDdl();
        }     
    }
    
    void populateDdl()
    {
        string val = "fct"+ddlTypePN.SelectedValue.ToString().Trim(); // Used for SELECT
        SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["My_DB"].ConnectionString);
        ddlFctPN.Items.Clear();
        DataTable subjects = new DataTable();
        try
        {
            SqlDataAdapter adapter = new SqlDataAdapter("My SELECT", sqlConn);
            adapter.Fill(subjects);
    
            ddlFctPN.DataSource = subjects;
            ddlFctPN.DataTextField = "libelle";
            ddlFctPN.DataValueField = "valeur";
            ddlFctPN.DataBind();
        }
        catch (Exception ex)
        {
            lblErr.Text = ex.Message;
        }
        ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null"));
    }
    
  • Flo
    Flo about 11 years
    I already tried !IsPostBack but still the same problem. I don't understand why I should put this code inside !IsPostBack because if I populate my 2nd ddl when SelectedIndexChanged of my 1st one is thrown, it is populated on PostBack? am i wrong?
  • Flo
    Flo about 11 years
    the 2nd list does not throw a postback,that's only the first in order to fill the 2nd one with different values if it's "PNT" or "PNC"
  • Flo
    Flo about 10 years
    thanks for your answer but i fixed my problem since a long time :) I was a novice at the moment i asked the question, the solution was so easy...