C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

datagridviewの選択処理について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■90272 / inTopicNo.1)  datagridviewの選択処理について
  
□投稿者/ sakamoto (3回)-(2019/02/21(Thu) 17:55:29)

分類:[C#] 

dataGridViewの選択処理について質問があります。

datagridviewの行が選択されている状態で、別の行を選択をした際、
特定の行の場合は選択をキャンセルし、元々選択されていた行に選択を戻し、
かつ、SelectionChangedイベントは発生させないようにしたいのですが、
以下の手順以外で簡単な方法があればご教示いただければと思います。

@元々の選択行を保持しておく。
A別の行を選択し、SelectionChangedイベントが走る(本当は走らせたくない)
BSelectionChangedイベント内で特定行のif条件に引っかかった場合、SelectionChangedイベントを一時的に-=で排除する。
C保持していた選択行を選択させる。
DSelectionChangedイベントを+=で復活させる。

以上です。宜しくお願いいたします。
引用返信 編集キー/
■90279 / inTopicNo.2)  Re[1]: datagridviewの選択処理について
□投稿者/ 魔界の仮面弁士 (2071回)-(2019/02/22(Fri) 11:15:10)
No90272 (sakamoto さん) に返信
> SelectionChangedイベントは発生させないようにしたいのですが、

DataGridView の OnSelectionChanged をオーバーライドして、

 protected override void OnSelectionChanged(EventArgs e)
 {
   if(発生させても良い) { base.OnSelectionChanged(e); }
 }

のように実装すれば OK です。ただし、イベントが発生しなくなるだけ。

選択セル、アクティブセル、アンカーセル、フォーカスセルなどの管理は
別途実装する必要があります。


既定の設定だと、Ctrl+ドラッグによる「複数の非連続範囲を選択」が可能ですし、
「全てのセルを選択」することもできる点にも注意してください。


> dataGridViewの選択処理について質問があります。

「最初の 3 行」までは普通に選択できるが、
それ以降は 1 行おきにしか選択できない DataGridView の実装例。

class SakamotoGrid : DataGridView
{
  protected override void SetSelectedRowCore(int rowIndex, bool selected)
  {
    if (rowIndex % 2 == 0 || rowIndex < 3)
    {
      base.SetSelectedRowCore(rowIndex, selected);
    }
  }
  protected override void SetSelectedColumnCore(int columnIndex, bool selected)
  {
    // base.SetSelectedColumnCore(columnIndex, selected);
  }
  protected override void SetSelectedCellCore(int columnIndex, int rowIndex, bool selected)
  {
    if (rowIndex % 2 == 0 || rowIndex < 3)
    {
      base.SetSelectedCellCore(columnIndex, rowIndex, selected);
    }
  }
  protected override bool SetCurrentCellAddressCore(int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
  {
    if (rowIndex % 2 == 0 || rowIndex < 3)
    {
      return base.SetCurrentCellAddressCore(columnIndex, rowIndex, setAnchorCellAddress, validateCurrentCell, throughMouseClick);
    }
    else
    {
      return false;
    }
  }
};


> datagridviewの行が選択されている状態で、別の行を選択をした際、

DataGridView の場合、
 (1) 現在のセル(行ヘッダ列に三角マークがつく)
 (2) 選択されているセル(選択色で反転表示されているセル)
 (3) フォーカスのあるセル(Tab キーを押すと移動するセルを囲む破線)
はそれぞれ別物として管理されていますが、その点は大丈夫でしょうか?


1 は CellEnter イベントや CurrentCellAddress プロパティなど
2 は SelectionChanged イベントや SelectedCells プロパティなど

たとえば Shift キーを押しながら他の行をクリックした場合、
1 にあたるセル(アンカーセル)は変化しないまま、
2 の状態が変更されます。



> 特定の行の場合は選択をキャンセルし、元々選択されていた行に選択を戻し、

この仕様だと、キーボード(矢印キーなど)での移動が阻害されてしまうのが難点ですね。
引用返信 編集キー/
■90289 / inTopicNo.3)  Re[2]: datagridviewの選択処理について
□投稿者/ sakamoto (4回)-(2019/02/22(Fri) 17:35:02)
No90279 (魔界の仮面弁士 さん) に返信
> ■No90272 (sakamoto さん) に返信
>>SelectionChangedイベントは発生させないようにしたいのですが、
>
> DataGridView の OnSelectionChanged をオーバーライドして、
>
>  protected override void OnSelectionChanged(EventArgs e)
>  {
>    if(発生させても良い) { base.OnSelectionChanged(e); }
>  }
>
> のように実装すれば OK です。ただし、イベントが発生しなくなるだけ。
>
> 選択セル、アクティブセル、アンカーセル、フォーカスセルなどの管理は
> 別途実装する必要があります。
>
>
> 既定の設定だと、Ctrl+ドラッグによる「複数の非連続範囲を選択」が可能ですし、
> 「全てのセルを選択」することもできる点にも注意してください。
>
>
>>dataGridViewの選択処理について質問があります。
>
> 「最初の 3 行」までは普通に選択できるが、
> それ以降は 1 行おきにしか選択できない DataGridView の実装例。
>
> class SakamotoGrid : DataGridView
> {
>   protected override void SetSelectedRowCore(int rowIndex, bool selected)
>   {
>     if (rowIndex % 2 == 0 || rowIndex < 3)
>     {
>       base.SetSelectedRowCore(rowIndex, selected);
>     }
>   }
>   protected override void SetSelectedColumnCore(int columnIndex, bool selected)
>   {
>     // base.SetSelectedColumnCore(columnIndex, selected);
>   }
>   protected override void SetSelectedCellCore(int columnIndex, int rowIndex, bool selected)
>   {
>     if (rowIndex % 2 == 0 || rowIndex < 3)
>     {
>       base.SetSelectedCellCore(columnIndex, rowIndex, selected);
>     }
>   }
>   protected override bool SetCurrentCellAddressCore(int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
>   {
>     if (rowIndex % 2 == 0 || rowIndex < 3)
>     {
>       return base.SetCurrentCellAddressCore(columnIndex, rowIndex, setAnchorCellAddress, validateCurrentCell, throughMouseClick);
>     }
>     else
>     {
>       return false;
>     }
>   }
> };
>
>
>>datagridviewの行が選択されている状態で、別の行を選択をした際、
>
> DataGridView の場合、
>  (1) 現在のセル(行ヘッダ列に三角マークがつく)
>  (2) 選択されているセル(選択色で反転表示されているセル)
>  (3) フォーカスのあるセル(Tab キーを押すと移動するセルを囲む破線)
> はそれぞれ別物として管理されていますが、その点は大丈夫でしょうか?
>
>
> 1 は CellEnter イベントや CurrentCellAddress プロパティなど
> 2 は SelectionChanged イベントや SelectedCells プロパティなど
>
> たとえば Shift キーを押しながら他の行をクリックした場合、
> 1 にあたるセル(アンカーセル)は変化しないまま、
> 2 の状態が変更されます。
>
>
>
>>特定の行の場合は選択をキャンセルし、元々選択されていた行に選択を戻し、
>
> この仕様だと、キーボード(矢印キーなど)での移動が阻害されてしまうのが難点ですね。
ご回答ありがとうございます。
キーボードでの操作、タブによる移動は頭に無かったため、それらについては別途考えてみようと思います。

一先ず解決したため、解決済みとさせていただきます!!!!
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ