トップ回答者
DataGridViewの左端列をクリック時、e.ColumnIndexは、-1を返すと思うのですが何故か1が返ってきます

質問
-
お世話になっております。
一番左の列をクリックしDeleteキー押下で行削除をしますが、
その際、列のインデックスを取得したいと思っております。
一番左端の列(RowHeaderというのでしょうか)をクリックしますと
通常e.ColumnIndexは、-1を返すと思うのですが、何故か1が返ってきます。
つまり1列目のインデックスが返ってくるのですが、これは何が原因でしょうか?
まる一日プロパティやイベントを調べましたが分かりません・・・。
そのグリッドは特に変わった処理やプロパティの設定はしていないと思うのですが・・・。
一応、通常どおりの戻り値を返すグリッドをコピペしたのですがこのような結果です・・・。
何か情報があれば宜しくお願いします。
回答
すべての返信
-
なかむら さま 、 anningo さま
有難うございます。アドバイスいただいたおかげで原因の場所が特定出来ました。
CellEnterイベントの中で
自分のCellClickイベントを呼び出しているのが原因でした。
CellClickイベントでは、
「1回のクリックでエディットモードにする」
という処理を実装しておりました。
CellClickイベント中に普通にこのように書いた場合、
this.OnCellClick(e);
コンパイルは通るのですが、実行ボタン押下後に
「SetCurrentCellAddressCore関数への再入呼呼び出しを生じるため、この操作は有効ではありません。」
というエラーメッセージが表示されるのですが、
このように書いた場合、
if (e.ColumnIndex >= 0)
{
this.OnCellClick(e);
}
エラーも出ずなかなか原因が特定出来ませんでした。
最初の質問とずれてきますが、実現したいことは、
①セルのエンター時にセルを入力モードにする②行削除は、一般的なグリッドのUI操作(一行選択→Deleteキー押下)で行削除する
ということなのですが、
①は、イベントの場所として不適切でしょうか? -
anningo さま
有難う御座います。
EditModeプロパティ知りませんでした。
デザイン時、イベント発生時にコードから両方試しましたが駄目でした。
試したコードは、以下です。
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { //1回のクリックでエディットモードにする if (e.ColumnIndex >= 0) { if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewTextBoxColumn) { //SendKeys.Send("{F2}"); dataGridView1.BeginEdit(true); } } } private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) { dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter; }
結局、「セルエンターで編集モード」
にすると
「行選択による行削除」
が出来なくようです。厳密には、行選択が出来ないため。
困った・・・・。