views:

7669

answers:

3

My selectedindexchanged event is not firing when I select values in my dropdown lists. These dropdown lists are implemented dynamically in the following code. I have tried changing autopostback and enableviewstate settings to no avail. I am using a static panel. Does anyone see how I can cause the selectedindexchanged event to fire?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ADONET_namespace;

namespace AddFileToSQL
{
    public partial class DataMatch : _Default
    {
        protected System.Web.UI.WebControls.PlaceHolder phTextBoxes;
        protected System.Web.UI.WebControls.PlaceHolder phDropDownLists;
        protected System.Web.UI.WebControls.Button btnAnotherRequest;
        protected System.Web.UI.WebControls.Panel pnlCreateData;
        protected System.Web.UI.WebControls.Literal lTextData;
        protected System.Web.UI.WebControls.Panel pnlDisplayData;
        //Panel pnlDropDownList;

        protected static string inputfile2;
        static string[] headers = null;
        static string[] data = null;
        static string[] data2 = null;
        static DataTable myInputFile = new DataTable("MyInputFile");
        static string[] myUserSelections;

        // a Property that manages a counter stored in ViewState
        protected int NumberOfControls
        {
            get { return (int)ViewState["NumControls"]; }
            set { ViewState["NumControls"] = value; }
        }

        public void EditRecord(object recordID)
        {
            SelectedRecordID = recordID;
            // Load record from database and show in control
        }

        protected object SelectedRecordID
        {
            get
            {
                return ViewState["SelectedRecordID"];
            }
            set
            {
                ViewState["SelectedRecordID"] = value;
            }
        }

        // Page Load 
        private void Page_Load(object sender, System.EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                this.NumberOfControls = 0;
            }
        }

        // Add DropDownList Control to Placeholder
        private void CreateDropDownLists()
        {
            for (int counter = 0; counter < NumberOfControls; counter++)
            {
                DropDownList ddl = new DropDownList();
                SqlDataReader dr = ADONET_methods.DisplayTableColumns(targettable);
                ddl.ID = "DropDownListID" + (counter + 1).ToString();
                ddl.DataTextField = "COLUMN_NAME";
                ddl.DataValueField = "COLUMN_NAME";
                ddl.DataSource = dr;
                ddl.DataBind();

                //myUserSelections[counter] = "";

                ddl.AutoPostBack = true;
                ddl.EnableViewState = true; //Preserves View State info on Postbacks
                ddl.Style["position"] = "absolute";
                ddl.Style["top"] = 100 * counter + 80 + "px";
                ddl.Style["left"] = 250 + "px";
                ddl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged);

                pnlDisplayData.Controls.Add(ddl);
                pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
                pnlDisplayData.Visible = true;

               // pnlDropDownList.FindControl(ddl.ID);
                dr.Close();
            }
        }

        protected void SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender; 
            string ID = ddl.ID;
        }

        // Add TextBoxes Control to Placeholder
        private void RecreateDropDownLists()
        {
            for (int counter = 0; counter < NumberOfControls; counter++)
            {
                DropDownList ddl = new DropDownList();
                SqlDataReader dr = ADONET_methods.DisplayTableColumns(targettable);

                ddl.ID = "DropDownListID" + (counter + 1).ToString();
                ddl.DataTextField = "COLUMN_NAME";
                ddl.DataValueField = "COLUMN_NAME";
                ddl.DataSource = dr;
                ddl.DataBind();
                myUserSelections[counter] = "";
                dr.Close();

                ddl.AutoPostBack = true;
                ddl.EnableViewState = false; //Preserves View State info on Postbacks
                ddl.Style["position"] = "absolute";
                ddl.Style["top"] = 100 * counter + 80 + "px";
                ddl.Style["left"] = 250 + "px";
                pnlDisplayData.Controls.Add(ddl);
                pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
            }
        }

        // Create TextBoxes and DropDownList data here on postback.
        protected override void CreateChildControls()
        {
            // create the child controls if the server control does not contains child controls
            this.EnsureChildControls();

            // Creates a new ControlCollection. 
            this.CreateControlCollection();

            // Here we are recreating controls to persist the ViewState on every post back
            if (Page.IsPostBack)
            {
                RecreateDropDownLists();
                RecreateLabels();
            }
            // Create these conrols when asp.net page is created
            else
            {
                PopulateFileInputTable();
                CreateDropDownLists();
                CreateLabels();
            }

            // Prevent child controls from being created again.
            this.ChildControlsCreated = true;
        }

        // Read all the data from TextBoxes and DropDownLists 
        protected void btnSubmit_Click(object sender, System.EventArgs e)
        {
            int cnt = FindOccurence("DropDownListID");
            EditRecord("DropDownListID" + Convert.ToString(cnt + 1));
            AppendRecords();
            pnlDisplayData.Visible = false;
        }

        private int FindOccurence(string substr)
        {
            string reqstr = Request.Form.ToString();
            return ((reqstr.Length - reqstr.Replace(substr, "").Length) / substr.Length);
        }
    }
}
+3  A: 

You're not assigning an event handler in your RecreateDropDownLists() method :)

womp
Yes, this did it! Thanks!
salvationishere
+1  A: 

You don't seem to be wiring up to the DropDownList's SelectedIndexChanged event if it's postback.

Given both the recreate and the create seem functionally identical, why not merge those? Encapsulate what varies.

TreeUK
Good point--I'll follow this advice.
salvationishere
A: 

thanks i got my requirement of changing the postion of dropdownlist dynamically

lokesh