2011-12-04 9 views
2

こんにちは私はここで問題を抱えています。コードは次のようになります。値をnullにすることはできません。パラメータ名:dataSource。データグリッドの編集とデータベースへの保存

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をクリックした後、それは私のデータベースに影響を与えることです。例。彼の名前を変更した後に私がクライアントとしてローマンを持っていて、ボタン1をクリックすると、それが変わるはずです。しかし、値を取得している私はnullエラーすることはできません。誰か助けてください。 T_T

* EDIT:HERESに更新されたコード

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); 

     } 

答えて

4

私はあなたがds呼ばインスタンス変数を持っていると仮定して、あなたはそれを移入するForm3_Load方法を期待していますか?

明示的方法で this.dsを使用しない限り、 dsと呼ばれる新しい ローカル変数を宣言しています
DataSet ds = new DataSet(); 

、変更するつもりはない:Form3_Loadにあなたは、これは持っているので、 - それは発生しませんinstance変数の値。

私はあなたがボタンをクリックしたときにNullReferenceExceptionを取得していないことに少し驚いているが、多分あなたはDataSetを作成して、どこかdsインスタンス変数への参照を割り当てるためのいくつかのコードを持っています。とにかく、上記の行を次のように変更してください:

ds = new DataSet(); 

この問題を修正する必要があります。

(私は強く、UIスレッドであなたの心をデータベース要求を行うことに対して助言する、とあなたは、接続のためのusing文を持っている必要がありますが、それらは別の問題である。)

+1

は、私はすでに作ることができましたデータセット、datatable、mysqladapterのグローバル変数を作成してコードを実行します。しかし、私は自分のテーブルの内容を一度しか変更できません。私は一度それを編集した後、私のテーブルの内容を編集することはできません。これの問題は何ですか? –

+0

@rjtubera:わかりませんが、それは私には別の質問のように聞こえます。詳細な説明と更新されたコードが必要です。 (あなたは本当に* global *変数を必要とすべきではありません。) –

+0

Ive上に更新されたコードを入れてください。私を助けてくれてありがとう。 T_T –

関連する問題