質問

私は持っています DataGridView オブジェクトのリストにバインドされています。 CellFormatting イベント、ように この答え. 。これは、を除くすべての列に適しています DataGridViewCheckboxColumn. 。このセル内(ただし、チェックボックスの外側)をクリックすると、セルのバックグラウンドがデフォルトの白に変わります。

視覚的には、セルの選択が発生しているように見えますが、それを止めるための最善の努力にもかかわらず。私のセルフォーマットコードが設定されます SelectionBackColor と同様に BackColor. 。を使用して細胞の選択を無効にしました CellStateChanged イベント、および他の列はいずれも選択可能ではありません。

private void PlayerGrid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

チェックボックスのセルの動作をオーバーライドするための追加の回避策はありますか?

役に立ちましたか?

解決

次のコードをに追加することで回避策を見つけました CellStateChanged イベント:

if (e.Cell is DataGridViewCheckBoxCell)
      e.Cell.Style.BackColor = BackgroundColor(e.Cell.RowIndex);

(BackgroundColor() 行に基づいてセルの背景色を計算します。)

これは問題を治しますが、追加のスタイルオブジェクトの作成を引き起こすことにより、より大きなテーブルまたは仮想テーブルのパフォーマンスの問題を引き起こす可能性があります。

他のヒント

私はむしろ自分がしていることに対するこのアプローチが好きです。マウスのクリックまたはタブ(目的のため)で、現在選択されているセルを強調表示するために、データグリッドビューセルのいずれかの背景色(チェックボックスを含む)を不可視に変更することができます。他のアプローチは、他のセルタイプが着色されているため、チェックボックスの背景を奇妙に色付けしていないことがわかりました。私の例では、CellFormattingイベントでこのアプローチを使用していますが、同様の構文を他の場所で成功させることができると思います。また、これは、特にセルフォーマットイベントに関連するOPSの質問にもっと密接に答えると思います。

void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {


if (W.mf.dgv.CurrentCell != null && e.RowIndex==W.mf.dgv.CurrentCell.RowIndex & e.ColumnIndex==W.mf.dgv.CurrentCell.ColumnIndex)
         {

                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Color.YellowGreen;

         }
         else
         {
                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = W.mf.dgv.DefaultCellStyle.SelectionBackColor;

         }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top