none
DataGridViewの左端列をクリック時、e.ColumnIndexは、-1を返すと思うのですが何故か1が返ってきます RRS feed

  • 質問

  • お世話になっております。

    一番左の列をクリックしDeleteキー押下で行削除をしますが、
    その際、列のインデックスを取得したいと思っております。


    一番左端の列(RowHeaderというのでしょうか)をクリックしますと
    通常e.ColumnIndexは、-1を返すと思うのですが、何故か1が返ってきます。

    つまり1列目のインデックスが返ってくるのですが、これは何が原因でしょうか?

    まる一日プロパティやイベントを調べましたが分かりません・・・。


    そのグリッドは特に変わった処理やプロパティの設定はしていないと思うのですが・・・。
    一応、通常どおりの戻り値を返すグリッドをコピペしたのですがこのような結果です・・・。


    何か情報があれば宜しくお願いします。
    2010年8月26日 17:37

回答

  • 詳細な仕様がつかめきれていないのですが、EditModeをEditProgrammaticallyにしておいて、必要に応じてDataGridView.BeginEditメソッドを実行して編集可能にするのはいかがでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年8月27日 4:23
    モデレータ
  • そういう動作になりそうなDataGridViewのプロパティは見当たらないので、イベントハンドラ内で何かまずい処理を行っているのかもしれません。

     

    DataGridView に設定しているプロパティやイベントハンドラのコードといった、より詳細な情報を記載していただけると、こちらでも検証ができます。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月26日 22:19

すべての返信

  • どのイベントで、何のために列インデックスを取得するのですか?

    普通、行ヘッダをクリックして一行選択、その後 Delete キーの押下でその選択している行を削除、という UI になると思いますが、それだけなら列インデックスは不要ですよね。行インデックスは必要かもしれませんが。

    2010年8月26日 19:16
  • Hongliang 様

    有難う御座います。

    CellClickイベントで編集モードにしようと思っています。

    その際に、以下のようにインデックスを参照しています。

    if (e.ColumnIndex >= 0)
    {
    this.BeginEdit(true);     
    }

    このColumnIndexに1が入ってきているのです。

    なのでHongliang 様のおっしゃるとおりのUI操作がしたいのですが、

    行ヘッダをクリックすると1列目が編集モードになってしまい一行選択の状態になりません。

     

     

    2010年8月26日 19:43
  • そういう動作になりそうなDataGridViewのプロパティは見当たらないので、イベントハンドラ内で何かまずい処理を行っているのかもしれません。

     

    DataGridView に設定しているプロパティやイベントハンドラのコードといった、より詳細な情報を記載していただけると、こちらでも検証ができます。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月26日 22:19
  • 一番左端の列(RowHeaderというのでしょうか)をクリックしますと
    通常e.ColumnIndexは、-1を返すと思うのですが、何故か1が返ってきます。

    つまり1列目のインデックスが返ってくるのですが、これは何が原因でしょうか?

    1列目のインデックスは 1 じゃなくて 0 では?

    問題点とは関係ないかもですが。

    2010年8月27日 0:48
  • なかむら さま 、 anningo さま

    有難うございます。アドバイスいただいたおかげで原因の場所が特定出来ました。

    CellEnterイベントの中で
    自分のCellClickイベントを呼び出しているのが原因でした。

    CellClickイベントでは、
    「1回のクリックでエディットモードにする」
    という処理を実装しておりました。


    CellClickイベント中に普通にこのように書いた場合、
    this.OnCellClick(e);

    コンパイルは通るのですが、実行ボタン押下後に
    「SetCurrentCellAddressCore関数への再入呼呼び出しを生じるため、この操作は有効ではありません。」
    というエラーメッセージが表示されるのですが、

    このように書いた場合、
    if (e.ColumnIndex >= 0)
    {
        this.OnCellClick(e);
    }
    エラーも出ずなかなか原因が特定出来ませんでした。


    最初の質問とずれてきますが、実現したいことは、
    ①セルのエンター時にセルを入力モードにする

    ②行削除は、一般的なグリッドのUI操作(一行選択→Deleteキー押下)で行削除する

    ということなのですが、
    ①は、イベントの場所として不適切でしょうか?

    2010年8月27日 2:14
  • クリックしたときにプログラムからクリックすればダブルクリックになる的な?

    残念ながら OnCellClick はイベントを発生させるだけで、クリックそのものは発生させないかと。。

    DataGridView のプロパティに EditMode というのがあります。

    それを EditOnEnter に変えるんじゃだめでしょうか?

    2010年8月27日 2:37
  • 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;
        }
    

     

    結局、「セルエンターで編集モード」
    にすると
    「行選択による行削除」
    が出来なくようです。厳密には、行選択が出来ないため。


    困った・・・・。

    2010年8月27日 4:15
  • 詳細な仕様がつかめきれていないのですが、EditModeをEditProgrammaticallyにしておいて、必要に応じてDataGridView.BeginEditメソッドを実行して編集可能にするのはいかがでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年8月27日 4:23
    モデレータ
  • trapemiyaさま

     

    いつもお世話になっております。

    せっかくアドバイス頂いたのに、未だ未確認です。

    取り急ぎお礼をさせていただきます。

    週明けに確認させてまたこちらへ返信させてください。

    宜しくお願い致します。

    2010年8月29日 11:07
  • trapemiyaさま

    有難うございます。遅くなりましたがアドバイス頂いた方法で試させていただきました。

    残念ながら同じ動作でした(行選択で、編集モードになってしまう)。

    今回は、仕様を変更することにいたしました。

     

    anningoさま、trapemiyaさま

    解決にはいたらずとも大変参考になりました。

    本当に有難うございました。

    2010年9月4日 15:19