使用Access DB数据填充ComboBox

时间:2014-07-02 18:53:52

标签: c# combobox

我使用Visual Studio 2010和C#创建一个带有组合框的窗体,该组合应包含员工姓名首字母。我花了最后几天搜索我能找到的每个解决方案,但仍然无法让我的组合框填充。

这就是我现在所拥有的:

public static void FillComboBox(string Query, System.Windows.Forms.ComboBox LoggedByBox)
{
    using (var CONN = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Users\\Documents\\Service Request Application\\bin\\Debug\\servicereq1.mdb"))
    {
        CONN.Open();
        DataTable dt = new DataTable();
        try
        {
            OleDbCommand cmd = new OleDbCommand(Query, CONN);
            OleDbDataReader myReader = cmd.ExecuteReader();
            dt.Load(myReader);
        }
        catch (OleDbException e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();

            return;
        }
        LoggedByBox.DataSource = dt;
        LoggedByBox.ValueMember = "ID";
        LoggedByBox.DisplayMember = "Initials";
    }
}

然后我在表单加载时调用它

private void Form1_Load(object sender, EventArgs e)
{
    FillComboBox("select ID, Initials from [Fixers and Testers]", LoggedByBox);
}

当我运行程序时,组合框仍然是空白的。我很肯定我的列名和表名是正确的。有什么建议吗?

4 个答案:

答案 0 :(得分:2)

我终于把我的ComboBox填满了,我想分享我为其他在搜索中偶然发现这个问题的人所做的改变。花了一点时间搜索其他问题和MSDN后,我能够想出这个。

    private void LoadComboLogged()
    {
        AppDomain.CurrentDomain.SetData("DataDirectory",@"\\prod\ServiceRequests");

        string strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=|DataDirectory|\servicereq1.mdb";

        try
        {
            using (OleDbConnection conn = new OleDbConnection(strCon))
            {
                conn.Open();
                string strSql = "SELECT Initials FROM [Fixers and Testers] WHERE [Status] ='C'";
                OleDbDataAdapter adapter = new OleDbDataAdapter(new OleDbCommand(strSql, conn));
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                loggedByComboBox.DataSource = ds.Tables[0];
                loggedByComboBox.DisplayMember = "Initials";
                loggedByComboBox.ValueMember = "Initials";

            }
        }
        catch (Exception ex)
        {

        }
    }

我还发现我需要打电话

    LoadComboLogged(); 

我初始化表单时如果没有该行,ComboBox将只显示一个空白下拉列表。希望这可以帮助遇到此问题的其他人。

答案 1 :(得分:0)

将控制权传递给导致此问题的静态方法。不是将控制传递给方法,而是使该方法返回表,并在load方法中加载控件。

答案 2 :(得分:0)

  SqlConnection con = new SqlConnection("Data Source=RUSH-PC\\RUSH;Initial Catalog=Att;Integrated Security=True");

            con.Open();
            SqlDataAdapter da = new SqlDataAdapter("select name from userinfo", con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            DataRow dr;
            dr = dt.NewRow();

            dt.Rows.InsertAt(dr, 1);
            comboBox1.DisplayMember = "name";
            comboBox1.ValueMember = "name";
            comboBox1.DataSource = dt;    
            con.Close();

这可能对你有所帮助...... 祝你好运......: - )

答案 3 :(得分:0)

另一种可能的解决方案是查询并返回字符串列表。也许它可能效率较低,但这是我最近在我的项目中使用的。这是一个驻留在方法中的示例,可能称为GetInitialsFromDatabase():

using(var conn = new MySqlConnection(connectionString)
{
    conn.Open();
    using(MySqlCommand cmd = new MySqlCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "SELECT Initials FROM [Fixers and Testers]  WHERE [Status] ='C'";
        MySqlDataReader reader = cmd.ExecuteReader();
        while(reader.Read())
        {
            // initials is a List<String> previously defined (Assuming strings)
            initials.Add(String.Format("{0}", reader[0]));
        }
    }
    conn.Close();
}

然后返回首字母列表,然后在你的GUI中你可以说:

comboBox1.DataSource = returnedList;
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;