プロが教えるわが家の防犯対策術!

.NETでWinFormアプリをC#で製作中です。
Visual Studio Community 2017を使用しています。

アプリ実行中に、DedaGridViewで複数のセルを選択して文字列を入力した際に、最後に選択したセルだけ入力が反映されます。
この時、他に選択していたセルにも今入力した値を反映させたいと思っています。

そこで検索して出てきたのが全く同じ内容の質問のこちらです。
https://oshiete.goo.ne.jp/qa/7455090.html

こちらでの回答をヒントに試しているのですが‥
具体的にどう記述すれば良いのかが分からず困っています。。

分からないことは大きく二つありまして‥

①CellValueChangedイベント内でまず選択中のセルの値をstring型の変数 s にでも入れておき‥
SelectedCellsでSelectedRowsで選択中の行番号をforeachで List<int> にでも入れていって‥
さらにforeachで List のindexに対応するセルのValueに s を代入する感じでしょうか?
どのような流れで処理するのが良いのでしょうか?

②また、CellValueChangedイベントで記述するとアプリ起動時にCSVに保存していた表データを読み込む際にも処理が走ってしまうようなので、これは表を全て読み込んでからイベントを有効にしたら良
い感じでしょうか。
this.dgv.CellValueChanged -= new DataGridViewCellEventHandler(dgv_CellValueChanged);
このような感じの記述を、Form1のコンストラクタ内に記述しても、Form1_Load内に記述しても、イベントが走ってしまいます。
どのように有効・無効を切り替えれば良いのでしょうか?

アドバイスありましたらぜひお願いします。m(_ _)m

A 回答 (1件)

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)


{
 if (ChangeCancel == false)
 {
  // 複数選択されていたら処理する
  if (dataGridView1.SelectedCells.Count > 1)
  {
   // 値変更で再帰的に呼び出された時に処理しないようにフラグ設定
   ChangeCancel = true;
   // 選択セル全部が対象(イベント発行の契機になったセルも含むが無視)
   for(int i = 0;i < dataGridView1.SelectedCells.Count;i++)
   {
    // 選択セルの値をイベント発行のセルの値に設定
    dataGridView1.SelectedCells[i].Value = dataGridView1[e.ColumnIndex, e.RowIndex].Value;
   }
   // 処理終わったのでフラグ解除
   ChangeCancel = false;
  }
 }
}

こんな感じでしょうかね?

②に関してはcsvファイルの読み込み開始時に
ChangeCancel = true;
して、読み込み完了後に
ChangeCancel = false;
とでもすればよいのではないでしょうか?
# 選択セルが2個以上で上記のループが回るので、csv読み込み前に選択セルをキャンセルする…という手もありますけど。
# 起動時以外でcsv読み込みするならば、その手は使えないかも知れませんが。

ちなみに、ChangeCancelは
private bool ChangeCancel;
とでもしてフォームのフィールドにしてください。
    • good
    • 2
この回答へのお礼

Wr5さん、丁寧にご回答いただいてありがとうございます!
できました!!

なるほど、コレクションで取得してforで回して一気に入力してやれば良かったのですね。。

また、イベント自体を有効・無効にするのではなく、中身をifで処理が走る・走らないを切り替えてやれば良かったのですね。。
教えていただくとシンプルな答えなのですが、頭に浮かびませんでした。。

お陰さまでひとつ賢くなりました‥!

お礼日時:2018/10/03 02:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A