dekempeneer
asked on
What is the best way to populate comboBox from database
Hi,
what is the best way to populate comboBox from database.. the reason I
am asking is that i have more than 8 comboBoxes in one form and each
should retrieve a lot of data (one combobox contains 50000 items) from a table and I don't want that to slow the form down.
I found this as answer on the net :
You can show the form, but disable the combos. After that, launch an async
delegate populating the combos, and enable them once the data are ready.
But I have no idea on how to do this, can you please submit a sample code...
what is the best way to populate comboBox from database.. the reason I
am asking is that i have more than 8 comboBoxes in one form and each
should retrieve a lot of data (one combobox contains 50000 items) from a table and I don't want that to slow the form down.
I found this as answer on the net :
You can show the form, but disable the combos. After that, launch an async
delegate populating the combos, and enable them once the data are ready.
But I have no idea on how to do this, can you please submit a sample code...
ASKER
It is a list of all the contacts of everybody and they are sorted by alphabet
Asynchronous Data Access using Callback Model
http://www.csharphelp.com/2007/07/asynchronous-data-access-using-callback-model/
http://www.csharphelp.com/2007/07/asynchronous-data-access-using-callback-model/
>> It is a list of all the contacts of everybody and they are sorted by alphabet
You can for example also use some kind of search, where the user first enters 3 or 4 characters of a name, that triggers a search a database and with this results the first 50 (or 100) will be filled into a dropdown
You can for example also use some kind of search, where the user first enters 3 or 4 characters of a name, that triggers a search a database and with this results the first 50 (or 100) will be filled into a dropdown
ASKER
and how can I do this if I would choose this ?
ASKER
by the way that asynchronous is for .net 2.0, is there not a better easier way in 4.0 already ? :)
Very easily: add a textbox and a button on the screen. Behind this button, you perform a query and load the data into the combobox.
Example below for an access-database
Example below for an access-database
string connString = "Microsoft.Jet.OLEDB.4.0;Data Source=C:\\bd1.mdb";
string SqlString = "Select top 50 LastName From Contacts Where LastName like '?*'";
using (OleDbConnection conn = new OleDbConnection(ConnString))
{
using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("LastName", txtLastName.Text);
conn.Open();
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
comboBox1.Items.Add(reader["LastName"].ToString());
}
}
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I'd still be concerned about performance. I agree with dhaest on this. Most UI controls get REALLY SLOW when you add such large numbers of items. Also, the thumb would be really small with that many items. A simple filter would make it so much better. A textbox to allow the user to enter a partial name would go a long way in making it more usable. When something is entered, re-issue the query, wrap the results in a new collection and bind the combo to it.
>>I found this as answer on the net :
>>You can show the form, but disable the combos.
Use this when your form loads
comboBox1.BeginUpdate();
>>and enable them once the data are ready.
Use this after your data is complete
comboBox1.EndUpdate();
If you want it asynchronously;
Use
comboBox1.BeginInvoke
>>You can show the form, but disable the combos.
Use this when your form loads
comboBox1.BeginUpdate();
>>and enable them once the data are ready.
Use this after your data is complete
comboBox1.EndUpdate();
If you want it asynchronously;
Use
comboBox1.BeginInvoke
OR with background worker
http://www.codeguru.com/forum/showthread.php?t=433482
OR with this for simple psudo code;
http://www.codeguru.com/forum/showthread.php?t=433482
OR with this for simple psudo code;
//Global Declaration
SqlDataAdapter da1 = new MySqlDataAdapter();
SqlDataAdapter da2 = new MySqlDataAdapter();
SqlDataAdapter da3 = new MySqlDataAdapter();
SqlDataAdapter da4 = new MySqlDataAdapter();
SqlDataAdapter da5 = new MySqlDataAdapter();
SqlDataAdapter da6 = new MySqlDataAdapter();
SqlDataAdapter da7 = new MySqlDataAdapter();
SqlDataAdapter da8 = new MySqlDataAdapter();
//During Form LOAD
...
string s1 = "select f1 from t1";
da1.SelectCommand = new SqlCommand(s1, YOURsqlconnection);
string s2 = "select f1 from t2";
da2.SelectCommand = new SqlCommand(s2, YOURsqlconnection);
string s3 = "select f1 from t3";
da3.SelectCommand = new SqlCommand(s3, YOURsqlconnection);
string s4 = "select f1 from t4";
da4.SelectCommand = new SqlCommand(s4, YOURsqlconnection);
string s5 = "select f1 from t5";
da5.SelectCommand = new SqlCommand(s5, YOURsqlconnection);
string s6 = "select f1 from t6";
da6.SelectCommand = new SqlCommand(s6, YOURsqlconnection);
string s7 = "select f1 from t7";
da7.SelectCommand = new SqlCommand(s7, YOURsqlconnection);
string s8 = "select f1 from t8";
da8.SelectCommand = new SqlCommand(s8, YOURsqlconnection);
...
DataTable dt1 = new DataTable();
da1.Fill (dt1);
DataTable dt2 = new DataTable();
da2.Fill (dt2);
DataTable dt3 = new DataTable();
da3.Fill (dt3);
DataTable dt4 = new DataTable();
da4.Fill (dt4);
DataTable dt5 = new DataTable();
da5.Fill (dt5);
DataTable dt6 = new DataTable();
da6.Fill (dt6);
DataTable dt7 = new DataTable();
da7.Fill (dt7);
DataTable dt8 = new DataTable();
da8.Fill (dt8);
//During Form SHOWN / or button click
comboBox1.BeginUpdate();
comboBox2.BeginUpdate();
comboBox3.BeginUpdate();
-do next down-
comboBox1.DisplayMember = "f1";
comboBox2.DisplayMember = "f1";
comboBox3.DisplayMember = "f1";
-do next down-
comboBox1.DataSource = dt1;
comboBox2.DataSource = dt2;
comboBox3.DataSource = dt3;
-do next down-
comboBox1.EndUpdate();
comboBox2.EndUpdate();
comboBox3.EndUpdate();
-do next down-
Note:
//use Datatable for SMALL memory consumption
OPs,
correction; for my second comment.
for MS sql
SqlDataAdapter da1 = new SqlDataAdapter();
for mYsql
MySqlDataAdapter da1 = new MySqlDataAdapter();
for ado
OLEDBlDataAdapter da1 = new OLEDBDataAdapter();
for odbc
ODbCDataAdapter da1 = new ODbcDataAdapter();
correction; for my second comment.
for MS sql
SqlDataAdapter da1 = new SqlDataAdapter();
for mYsql
MySqlDataAdapter da1 = new MySqlDataAdapter();
for ado
OLEDBlDataAdapter da1 = new OLEDBDataAdapter();
for odbc
ODbCDataAdapter da1 = new ODbcDataAdapter();
I would suggest that you implement a master/detail combo box wherein the user will first select a category (master) then once a selection has been made, populate another combo box (detail) for the items for the selected category...