【问题标题】:Value cannot be null. Parameter name: dataSource. Editing Datagrid and Save to Database值不能为空。参数名称:数据源。编辑数据网格并保存到数据库
【发布时间】:2012-01-12 12:19:53
【问题描述】:

您好,我在这里遇到了问题。代码如下所示。

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,它应该会更改。但是我得到一个值不能是空错误。请有人帮忙。 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);

        }

【问题讨论】:

    标签: c# winforms datagrid datagridview editing


    【解决方案1】:

    我假设您有一个名为dsinstance 变量,并且您希望Form3_Load 方法填充它?这不会发生 - 因为在 Form3_Load 你有这个:

    DataSet ds = new DataSet();
    

    这声明了一个名为ds 的新本地 变量,因此除非您在方法中明确使用this.ds,否则您不会更改instance 变量的值。

    我有点惊讶,当您单击按钮时没有得到 NullReferenceException,但也许您有一些代码来创建一个 empty DataSet 并分配一个在某处引用ds 实例变量。无论如何,将上面显示的行更改为:

    ds = new DataSet();
    

    应该解决这个问题。

    (请注意,我强烈建议您不要在 UI 线程中发出数据库请求,并且您应该为您的连接使用 using 语句,但这些是单独的问题。)

    【讨论】:

    • 我已经设法通过为数据集、数据表和 mysqladapter 创建全局变量来运行代码。但是,我只能修改一次表的内容。编辑一次后,我无法编辑表格的内容。这是什么问题?
    • @rjtubera:我不知道,但这对我来说听起来像是一个单独的问题,需要更详细的描述和更新的代码。 (顺便说一句,您不需要真正的 全局 变量。)
    • 我把更新的代码放在上面。非常感谢你帮助我。 T_T
    • @rjtubera:不,我建议你问一个问题。当一篇帖子实际上最终包含几个随时间变化的问题时,Stack Overflow 无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2014-02-17
    • 1970-01-01
    • 2017-06-08
    • 2013-04-23
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多