无法在Datagridview中填充Combobox

时间:2018-05-10 09:55:29

标签: c#

我有一个项目,它需要在Combobox上选择数据库列表并在Datagridview中显示它。这是我的代码:

 private void Form2_Load(object sender, EventArgs e)
            {
                OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + @"data source= D:\Database\đồ án\Đồ án.mdb");
                DataTable dt = new DataTable();
                DataSet ds = new DataSet();
                ds.Tables.Add(dt);
                OleDbDataAdapter da = new OleDbDataAdapter("Select * from Sheet1", con);
                da.Fill(dt);
                da.Dispose();

                comboBox1.DataSource = dt;
                comboBox1.DisplayMember = "Tên đề tài";
                comboBox1.ValueMember = "Mã đề tài";
            }

 private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + @"data source= D:\Database\đồ án\Đồ án.mdb");

            DataTable dt = new DataTable();
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            OleDbDataAdapter da = new OleDbDataAdapter("Select * from Sheet11 Where Mã đề tài = "+comboBox1.SelectedValue, con);
            da.Fill(dt);
            da.Dispose();
            dataGridView1.DataSource = dt;
        }

当我运行此程序并单击Combobox时,它显示错误:

https://i.stack.imgur.com/C7DdZ.png

起初,我认为数据库中的2张(表格)没有显示并且没有关系,但是当我完成它并尝试重新开始时,它再次显示错误。我该如何解决?

2 个答案:

答案 0 :(得分:2)

2个重要说明:

  1. 使用参数而不是字符串连接
  2. 在列名称上使用空格是不好的做法。如果您这样做,请使用括号
  3. 考虑到上述情况,请尝试:

    string query="Select * from Sheet11 Where [Mã đề tài] = @param";
    OleDbCommand command = new OleDbCommand(query, con);
    cmd.Parameters.Add(new OleDbParameter("@param", comboBox1.SelectedValue))
    

答案 1 :(得分:1)

除了列名称中的'空格' 错误之外,当您设置{{1}时,绑定的顺序也会出错}}

您需要首先设置成员,只需然后 数据源。所以改变

ComboBox

为:

comboBox1.DataSource = dt;
comboBox1.DisplayMember = "Tên đề tài";
comboBox1.ValueMember = "Mã đề tài";

现在不是整个表都绑定了,而只是你想要的列。

之前,comboBox1.DisplayMember = "Tên đề tài"; comboBox1.ValueMember = "Mã đề tài"; comboBox1.DataSource = dt; 不是单个值,而是整个SelectedValue,您必须从中选择正确的项目/列。

并且,由于它是一个引用对象,将其强制转换为字符串(隐式使用DataRowView运算符或明确地使用+调用)只会导致类名 ToString而不是数据值。

补充说明:

  • 避免使用任何类型的名称;一些moderen系统可能会使用它们,但它会使代码不那么健壮。非ascii字符也是如此。

  • 虽然此处查询中的值仅来自数据库,但建议仅使用参数化查询以避免任何 sql注入

  • 由于您已经将数据加载到System.Data.DataRowView,您也可以过滤它们,而无需再次返回数据库。为此,请创建DataTableBindingSource DataView并将DGV绑定到该RowFilter。为此,请将DataTable设为类变量