【问题标题】:Datagridview1 does not include new database rowsDatagridview1 不包括新的数据库行
【发布时间】:2014-02-01 17:51:09
【问题描述】:

我正在将一个程序从 VS C# 2003 移植到 VS C# 2012,并且在 2012 年遇到了一个问题,我在使用 C# 2003 时没有遇到。

为了演示,我创建了一个简单的 form1,只有一个 datagridview1

private void Form1_Load(object sender, EventArgs e)

//includes only this
this.table1TableAdapter.Fill(this.database1DataSet.Table1);

datagridview1 正确显示数据源中的 2 个测试行(MS Access dB)

问题是,如果我将第三行添加到 MS Access dB 并再次运行程序, 它仍然只显示原始的 2 行。

我已反复搜索解决方案,因此datagridview1 将显示新的 dB 行,从第 3 行开始,但找不到。这不应该这么难,不是吗?!

这个链接似乎有解决方案: how to update rows list of a datagridview after adding new row to a table

但我无法让它工作。

帮助!

谢谢。

【问题讨论】:

  • “再次运行程序”是什么意思?您是点击窗口上的按钮还是从桌面/资源管理器运行它?另外,请显示并检查您的选择。可能您添加的新行不符合 SELECT 条件。

标签: c# datagridview datasource


【解决方案1】:

正如你在这个SE question 中的意思,尝试将dataGridView 的DataSource 设置为null,然后再次绑定它。

我建议为此使用 void 并随时调用它。

添加using System.Data.OleDb

例子

private void LoadData()
{
string Constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/PathToYourAccessFile";
string SQLstr = "Select * from YourAccessTable";
OleDbConnection Conn = new OleDbConnection(Constr);
Conn.Open();
OleDbDataAdapter ODA;
DataTable DT;
ODA = new OleDbDataAdapter (SQLstr, Conn ); 
DT = new DataTable();
ODA.Fill(DT);
dataGridView1.DataSource = DT ;
Conn.Close();

}

调用LoadData();之类的方法

这是直接访问Access数据库的方式

    NorthwindDataSetTableAdapters.RegionTableAdapter regionTableAdapter = 
        new NorthwindDataSetTableAdapters.RegionTableAdapter();

regionTableAdapter.Delete(5, "NorthWestern");

来自MSDN

直接从WinForms插入尝试关注

 string myConnectionString;
        myConnectionString =
                @"Provider=Microsoft.ACE.OLEDB.12.0;" +
                @"Data Source=C:\Users\Public\Database1.accdb;";

        using (var con = new OleDbConnection())
        {
            con.ConnectionString = myConnectionString;
            con.Open();

            using (var cmd = new OleDbCommand())
            {
                cmd.Connection = con;
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText =
                    @"INSERT INTO YourTable (Column1, Column2) VALUES ('Hello', 'World')";
                cmd.ExecuteNonQuery();
            }
            con.Close();
        }

使用此代码在datagridview中打开数据库

【讨论】:

  • 感谢您的回复!
  • 不,它没有。我怎么不能在这里打回车转到下一行?那好吧!我这样做了:this.table1TableAdapter.Fill(this.database1DataSet.Table1);加载数据();和 private void LoadData() 就像你展示的那样。现在数据网格没有行,甚至没有原始的 2 行。
  • 如果我添加了这个:private void button1_Click(object sender, EventArgs e) { LoadData(); } 结果是一样的。我不明白为什么 table1tableadapter.fill 默认情况下不会是动态的并且不会自动获取新的 dB 行?我已经尝试追踪这个问题一个多星期了。
  • 成功了!!!谢谢!在它运行之前,我需要使用 System.Data.OleDb 添加;然后从静态字符串 Consr 中删除 'static' (否则得到“修饰符 'static' 对此项无效”)并将路径更改为 --> Data Source=C:\\Users\\User1\\Documents\ \Database1.accdb" 然后它工作了!!太酷了。再次感谢您的帮助。
  • @user3260976 很高兴为您提供帮助,如果它可以解决您的问题,您可能会接受它作为答案。
【解决方案2】:

通过将 LoadData 添加到 Form1_Load 来解决问题,如下所示:

    private void Form1_Load(object sender, EventArgs e)
    {
        this.table1TableAdapter.Fill(this.database1DataSet.Table1);
        LoadData(); 

    }

其中 LoadData 是根据 Marek 的建议:

    private void LoadData()
    {
        string Constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\User1\\Documents\\Database1.accdb";
        string SQLstr = "Select * from Table1";
        OleDbConnection Conn = new OleDbConnection(Constr);
        Conn.Open();
        OleDbDataAdapter ODA;
        DataTable DT;
        ODA = new OleDbDataAdapter (SQLstr, Conn ); 
        DT = new DataTable();
        ODA.Fill(DT);
        dataGridView1.DataSource = DT ;
        Conn.Close();

    }

【讨论】:

  • 为什么您发布的答案与我发布的相同?要让社区知道正确答案,请使用帖子左侧的“标记为答案”按钮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2021-12-14
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多