使用组合框从数据库中选择表并填充 datagridview - 无法使其工作

Posted

技术标签:

【中文标题】使用组合框从数据库中选择表并填充 datagridview - 无法使其工作【英文标题】:Selecting table from database with combobox and populating datagridview-can't get it to work 【发布时间】:2013-06-24 14:13:52 【问题描述】:
OleDbDataAdapter da2 = new OleDbDataAdapter("SELECT nazivMaterijala FROM popisMaterijala",     con);
DataTable dt = new DataTable();
da2.Fill(dt);
BindingSource bndSource2 = new BindingSource();
bndSource2.DataSource = dt;
this.comboBox1.DataSource = bndSource2;
comboBox1.DisplayMember = "nazivMaterijala";
comboBox1.ValueMember = "nazivMaterijala";

通过这部分代码,我将表名放入组合框

private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
    
        OleDbConnection con = new OleDbConnection(connectionString);
        OleDbDataAdapter da2 = new OleDbDataAdapter("SELECT * FROM ["     +this.comboBox1.SelectedValue.ToString() +"]", con);
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        da2.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        da2.Fill(dt);
        this.dataGridView1.DataSource = dt; 
    

从 combobox1 中选择某些内容后,它应该使用所选表中的数据填充 gridview,但无法使其工作

这是我尝试运行它时收到的消息:Microsoft Access 数据库引擎找不到输入表或查询“System.Data.DataRowView”。确保它存在并且其名称拼写正确。

【问题讨论】:

设置数据源后尝试添加这一行 this.dataGridView1.DataBind(); 没什么,我上面提到的错误我在这一行得到-> "da2.Fill(dt);" 尝试将this.comboBox1.DataSource = bndSource2;放在DisplayMemberValueMember的定义之后 哪个da2.Fill(dt) 失败了? 【参考方案1】:

尝试改用SelectionChangeCommitted。 SelectedValueChanged 事件在绑定期间引发,在此上下文中,实际值 DisplayMember 和 ValueMember 未正确设置

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)

    // Better to be safe here.....
    if (this.comboBox1.SelectedValue == null)
        return;

    using(OleDbConnection con = new OleDbConnection(connectionString))
    using(OleDbDataAdapter da2 = new OleDbDataAdapter("SELECT * FROM ["     +this.comboBox1.SelectedValue.ToString() +"]", con))
    
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        da2.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        da2.Fill(dt);
        this.dataGridView1.DataSource = dt; 
    

See also this question 更好地解释问题

【讨论】:

【参考方案2】:

我认为正在发生的事情是您将组合框绑定到从第一个查询返回的数据集的 Datarows。因此,当您对所选值执行 toString 时,您只是输出 System.Data.DataRowView。您需要将所选项目转换为 System.Data.DataRowView,然后在其中找到包含 TableName 的正确列并将其传递到您的第二个查询中。像这样的东西。另外请记住,如果未选择任何内容,则需要检查以确保 selectedItem 不为空。

DataRowView dView = (DataRowView)this.comboBox1.SelectedItem;
OleDbDataAdapter da2 = new OleDbDataAdapter("SELECT * FROM ["     + dView.Row["ColumnName that contains TableName"].ToString() +"]", con);

【讨论】:

以上是关于使用组合框从数据库中选择表并填充 datagridview - 无法使其工作的主要内容,如果未能解决你的问题,请参考以下文章

Visual Basic - 使用组合框将 Access 表中的数据填充到文本框

读取自定义Datagrid的每个单元格数据 - WPF C#

如何获取 WPF DataGrid 的单元格级别组合框?

在 DataTable 更改 WPF 后更新绑定到 DataTable 的 DataGrid

sql 选择表并组合

ComboBox不会在DataGridTemplateColumn中显示绑定数据