locked
populate two drop down lists with one query RRS feed

  • Question

  • User154499744 posted

    I have 2 drop down lists. dlist_1 and dlist_2. I want to populate both with the result from a sql query. This is the code I have.

    string ConnectionString = ConfigurationManager.ConnectionStrings["SomeDB"].ConnectionString;
    using (SqlConnection con = new SqlConnection(ConnectionString))
    {
    	SqlCommand cmd = new SqlCommand("SELECT DISTINCT [SomeValue] FROM dbo.SomeTable", con);
    	cmd.CommandType = CommandType.Text;
    	con.Open();
    
    	SqlDataReader MyList = cmd.ExecuteReader();
    
    	dlist_1.DataSource = MyList;
    	dlist_1.DataValueField = "SomeValue";
    	dlist_1.DataTextField = "SomeValue";
    	dlist_1.DataBind();
    
    	dlist_2.DataSource = MyList;
    	dlist_2.DataValueField = "SomeValue";
    	dlist_2.DataTextField = "SomeValue";
    	dlist_2.DataBind();
    }

    This seems to populate only dlist_1. If I put dlist_2 first then it populates dlist_2 only. Basically, it populates whatever dlist I assign first and that's it.

    I suppose I could have done 2 separate using ( ... ) { ... } with the same query, but I tried doing it this way. Why doesn't this work?

    Thursday, June 9, 2016 4:11 PM

Answers

  • User475983607 posted

    The SqlDataReader is a forward-only stream.  You need to copy the reader records to a collection then bind the collection to each dropdown or use a data adapter.

    These examples use the Adventure Works database.

            public void PopulateDdlAdapter()
            {
                string ConnectionString = ConfigurationManager.ConnectionStrings["AdventureWorks"].ToString();
                string cmd = @"SELECT TOP 10 [ProductID]
                                          ,[Name]
                                      FROM [AdventureWorks2008R2].[Production].[Product]";
                SqlDataAdapter adapter = new SqlDataAdapter(cmd, ConnectionString);
    
                DataSet MyList = new DataSet();
                adapter.Fill(MyList, "Customers");
    
    
                dlist_1.DataSource = MyList;
                dlist_1.DataValueField = "ProductID";
                dlist_1.DataTextField = "Name";
                dlist_1.DataBind();
    
                dlist_2.DataSource = MyList;
                dlist_2.DataValueField = "ProductID";
                dlist_2.DataTextField = "Name";
                dlist_2.DataBind();
    
            }
    
            public void PopulateDdlList()
            {
                string ConnectionString = ConfigurationManager.ConnectionStrings["AdventureWorks"].ToString();
                using (SqlConnection con = new SqlConnection(ConnectionString))
                {
                    SqlCommand cmd = new SqlCommand(@"SELECT TOP 10 [ProductID]
                                  ,[Name]
                              FROM [AdventureWorks2008R2].[Production].[Product]", con);
                    cmd.CommandType = CommandType.Text;
                    con.Open();
    
                    SqlDataReader MyList = cmd.ExecuteReader();
                    ListItemCollection items = new ListItemCollection();
                    while (MyList.Read())
                    {
                        items.Add(new ListItem() { Value = MyList["ProductID"].ToString(), Text = (string)MyList["Name"].ToString() });
                    }
    
                    dlist_1.DataSource = items;
                    dlist_1.DataValueField = "Value";
                    dlist_1.DataTextField = "Text";
                    dlist_1.DataBind();
    
                    dlist_2.DataSource = items;
                    dlist_2.DataValueField = "Value";
                    dlist_2.DataTextField = "Text";
                    dlist_2.DataBind();
                }
    
    
            }

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Thursday, June 9, 2016 7:22 PM

All replies

  • User-359936451 posted

    What version of .net?

    Thursday, June 9, 2016 6:34 PM
  • User475983607 posted

    The SqlDataReader is a forward-only stream.  You need to copy the reader records to a collection then bind the collection to each dropdown or use a data adapter.

    These examples use the Adventure Works database.

            public void PopulateDdlAdapter()
            {
                string ConnectionString = ConfigurationManager.ConnectionStrings["AdventureWorks"].ToString();
                string cmd = @"SELECT TOP 10 [ProductID]
                                          ,[Name]
                                      FROM [AdventureWorks2008R2].[Production].[Product]";
                SqlDataAdapter adapter = new SqlDataAdapter(cmd, ConnectionString);
    
                DataSet MyList = new DataSet();
                adapter.Fill(MyList, "Customers");
    
    
                dlist_1.DataSource = MyList;
                dlist_1.DataValueField = "ProductID";
                dlist_1.DataTextField = "Name";
                dlist_1.DataBind();
    
                dlist_2.DataSource = MyList;
                dlist_2.DataValueField = "ProductID";
                dlist_2.DataTextField = "Name";
                dlist_2.DataBind();
    
            }
    
            public void PopulateDdlList()
            {
                string ConnectionString = ConfigurationManager.ConnectionStrings["AdventureWorks"].ToString();
                using (SqlConnection con = new SqlConnection(ConnectionString))
                {
                    SqlCommand cmd = new SqlCommand(@"SELECT TOP 10 [ProductID]
                                  ,[Name]
                              FROM [AdventureWorks2008R2].[Production].[Product]", con);
                    cmd.CommandType = CommandType.Text;
                    con.Open();
    
                    SqlDataReader MyList = cmd.ExecuteReader();
                    ListItemCollection items = new ListItemCollection();
                    while (MyList.Read())
                    {
                        items.Add(new ListItem() { Value = MyList["ProductID"].ToString(), Text = (string)MyList["Name"].ToString() });
                    }
    
                    dlist_1.DataSource = items;
                    dlist_1.DataValueField = "Value";
                    dlist_1.DataTextField = "Text";
                    dlist_1.DataBind();
    
                    dlist_2.DataSource = items;
                    dlist_2.DataValueField = "Value";
                    dlist_2.DataTextField = "Text";
                    dlist_2.DataBind();
                }
    
    
            }

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Thursday, June 9, 2016 7:22 PM
  • User61956409 posted

    Hi NewKid1nTown,

    Firstly, this link discussed a similar issue, you could refer to it.

    http://stackoverflow.com/questions/12228059/can-i-bind-same-datareader-object-to-2-controls

    Secondly, as mgebhard said, you could try to use SqlDataAdapter to fill DataTable or DataSet then populate DropDowns with DataTable.

    using (SqlConnection con = new SqlConnection(ConnectionString))
    {
        con.Open();
    
        SqlDataAdapter adp = new SqlDataAdapter("SELECT DISTINCT [SomeValue] FROM dbo.SomeTable", con);
    
        DataTable dt1 = new DataTable();
        adp.Fill(dt1);
        DataTable dt2 = new DataTable();
        adp.Fill(dt2);
    
        dlist_1.DataSource = dt1;
        dlist_1.DataValueField = "Field1";
        dlist_1.DataTextField = "Field2";
        dlist_1.DataBind();
    
        dlist_2.DataSource = dt2;
        dlist_2.DataValueField = "Field1";
        dlist_2.DataTextField = "Field2";
        dlist_2.DataBind();
    
        con.Close();
    }
    

    Best Regards,

    Fei Han

    Friday, June 10, 2016 7:02 AM