值不能为空。参数名称:dataSource。编辑Datagrid并保存到数据库

时间:2011-12-04 06:40:08

标签: c# winforms datagrid datagridview editing

您好我在这里遇到了问题。代码看起来像这样。

private void Form3_Load(object sender, EventArgs e)
{ 
     string connectionString =
     "Server=localhost;" +
     "Database=oroderm;" +
     "User ID=root;" +
     "Password=root;" +
     "Pooling=false";
     string query = "Select * from client";
     MySqlConnection conn = new MySqlConnection(connectionString);
     MySqlDataAdapter dAdapter = new MySqlDataAdapter(query, connectionString);
     conn.Open();
     DataSet ds = new DataSet();
     MySqlCommandBuilder cBuilder = new MySqlCommandBuilder(dAdapter);

     dAdapter.Fill(ds, "client");

     BindingSource bSource = new BindingSource();
     bSource.DataSource = ds.Tables["client"];
     dataGridView2.DataSource = bSource;
}

private void button1_Click(object sender, EventArgs e)
{
     DataTable dt = ds.Tables["client"];
     this.dataGridView2.BindingContext[dt].EndCurrentEdit();
     this.da.Update(dt);
}

所以我想要的是每当我编辑Datagrid中的值时,单击button1(保存按钮)后它将影响我的数据库。恩。如果我在更改名称后将罗马作为客户端,我单击button1则应该更改。但是我得到一个值不能为null错误。请有人帮忙。 T_T

*编辑:继续更新的代码

private MySqlDataAdapter _da;
        private DataTable _dt;
        private DataSet _ds;

 private void Form3_Load(object sender, EventArgs e)
        {
               updateClient();
        }

public void updateClient()
        {
            string connectionString =
             "Server=localhost;" +
             "Database=oroderm;" +
             "User ID=root;" +
             "Password=root;" +
             "Pooling=false";

            string query = "select * from client";
            MySqlConnection conn = new MySqlConnection(connectionString);
            _da = new MySqlDataAdapter(query, connectionString);
            conn.Open();
            _ds = new DataSet();
            MySqlCommandBuilder cBuilder = new MySqlCommandBuilder(_da);

            _da.Fill(_ds, "client");
            BindingSource bSource = new BindingSource();
            bSource.DataSource = _ds.Tables["client"];
            dataGridView2.DataSource = bSource;
            _da.UpdateCommand = cBuilder.GetUpdateCommand();
        }

private void button1_Click(object sender, EventArgs e)
        {

            _dt = _ds.Tables["client"];
            this.dataGridView2.BindingContext[_dt].EndCurrentEdit();
            this._da.Update(_dt);

        }

1 个答案:

答案 0 :(得分:4)

我假设您有一个名为ds实例变量,并且您期望Form3_Load方法填充它?这不会发生 - 因为在Form3_Load你得到了这个:

DataSet ds = new DataSet();

这是声明一个名为ds的新本地变量,所以除非您在方法中明确使用this.ds,否则您不会更改{{{ 1}}变量。

当您点击按钮时,我没有得到instance,我感到有些惊讶,但是您可能已经有了一些代码来创建 {{1}并在某处分配对NullReferenceException实例变量的引用。无论如何,将上面显示的行改为:

DataSet

应该解决这个问题。

(我强烈建议您不要在UI线程中发出数据库请求,请注意,您的连接应该有ds语句,但这些是不同的事情。)