DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MySqlDataAdapterの更新処理について

環境/言語:[WindowsXP .NET]
分類:[.NET]

こんばんは。
よしよしと申します。

MySqlDataAdapterの更新処理についてお聞きしたいのですが、以下ソースを載せます。

ConnecterMySqlクラス

    //データアダプタ宣言
    private MySqlDataAdapter da;

//テーブルからデータを取得する
public bool TableReader(string select_sql, DataTable datatable)
{
da = new MySqlDataAdapter(select_sql, conn);

try
{
da.Fill(datatable);

}
catch (MySqlException ex)
{
MessageBox.Show("データ取得に失敗しました\n" + ex.Message);
return false;
}

return true;

}

上記にて、daにSelect文を格納し、同時に、da.Fill(datatable)でdatatableに結果を格納しました。
呼び出し側の処理は

DataTable dt_m_mondai = new DataTable();
Connector cn_m_mondai = new Connector(); //db m_kokyaku用コネクタ宣言

//dataGridView1読み込み
cn_m_mondai.TableReader("select * from m_mondai", dt_m_mondai);
dataGridView1.DataSource = dt_m_mondai;

dataGridView1にDataTableをセットする。ここまでは正常におこなえました。

次に、データベースの更新処理をおこないました。(データベースの更新は正常に行えました)
しかし、そのままでは、dataGridViewの内容が切り替わらないため、DataTable更新のために、下記処理を行いました。

public bool UpdateDataTable(DataTable datatable)
{
try
{
da.Fill(datatable);
}
catch(MySqlException ex)
{
MessageBox.Show("更新処理に失敗しました\n" + ex.Message);
return false;
}

return true;

}

ConnecterMySqlクラス内にて daは、共通変数として宣言。(先ほどのSelect文が格納)
da.Fill(datatable); にて、datatabelの内容を更新。

この状態でデータベース上の、値が変更されておれば、datatableの内容も変わると思うのですが、初期取得状態(TableReaderの状態)のままなのです。
(DBの値の変更は確認しました)
MSDNでは、”DataTable 名を使用して、データ ソース内の行と一致するように、DataSet 内の指定した範囲の行を追加または更新します。”
とあるのですが、意中の結果が得られませんでしたので、

datatable.Clear();
da.Fill(datatable);

と変えて、一旦datatableを空にし、再度読み込むという方法に変えたところ一応上手くいきました。

ところが、dataGridViewのカーソル位置を、復元するために
DataGridViewCell CurrentCell;  と宣言し
CurrentCell = dataGridView1.CurrentCell; (更新前に、現在カーソル位置を保存)(この内容は正常(デバックで確認しました))

更新後に、
dataGridView1.Focus();
dataGridView1.CurrentCell = CurrentCell;
としたところ、変数 CurrentCell が不正値 (RowIndex=-1)になってしまいます。

datatable.Clear();を外すと、正常にCurrentCellが復元されるため
どうにも困っています。

何かいい手はないものでしょうか?
> ところが、dataGridViewのカーソル位置を、復元するために
> DataGridViewCell CurrentCell;  と宣言し
> CurrentCell = dataGridView1.CurrentCell; (更新前に、現在カーソル位置を保存)(この内容は正常(デバックで確認しました))
>
> 更新後に、
> dataGridView1.Focus();
> dataGridView1.CurrentCell = CurrentCell;
> としたところ、変数 CurrentCell が不正値 (RowIndex=-1)になってしまいます。

CurrentCellではなく、CurrentCellのRowIndex,とColumnIndexを取り出しておき、
RowIndex,とColumnIndexでカーソル位置を再設定する必要があると思います。

CurrentCellは、値型ではなく参照型のはずなので、参照元のdataGridViewを読み直した場合
CurrentCellも初期化されるのだと思います。

DOBON.NET | プログラミング道 | プログラミング掲示板