bugfix> c# > 投稿

DGVで、セルをクリックした後、同じ列のすべてのセルの背景色を何らかの値で変更したい。別のセルをクリックした後、前のセル(およびそのすべての列)はデフォルトのスタイルに戻す必要があります

       int    currCell = dgvLogHeader.CurrentCell.ColumnIndex;
        string pattern = dgvLogHeader.CurrentCell.Value.ToString();
        dgvLogHeader.AlternatingRowsDefaultCellStyle.BackColor = SystemColors.ScrollBar;
        dgvLogHeader.DefaultCellStyle.BackColor = SystemColors.Info;
        for (int j=0; j < dgvLogHeader.Rows.Count; j++ ) {
            //dgvLogHeader.Columns[currCell].
            if (dgvLogHeader.Rows[j].Cells[currCell].Value.ToString() == pattern) {
                dgvLogHeader.Rows[j].Cells[currCell].Style.BackColor = Color.Brown;
            }
        }

しかし、そのセルが背景を変更すると、デフォルトのスタイルは失われます。

回答 1 件
  • これはそれを行う1つの方法です。

    private void dgvLogHeader_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        foreach (DataGridViewColumn col in dgvLogHeader.Columns)
        {
            if (col.DefaultCellStyle.BackColor != Color.Empty)
                col.DefaultCellStyle.BackColor = Color.Empty;
        }
        dgvLogHeader.Columns[e.ColumnIndex].DefaultCellStyle.BackColor = Color.Gainsboro;
    }
    
    

    これにより、最初に各列がデフォルトの色( Color.Empty )そして、現在の列に色を付けます。

    設定した色はリセットされないことに注意してください個々の細胞

    リセットして、それぞれを Color.Empty に設定する必要があります 。

    追加したい場合があります

    dgvLogHeader.ClearSelection();
    
    

    クリックしたセルの選択をクリアします。

    だが:セルの値に応じて、個別に色を決定する必要がある場合は、セルを循環する必要があります。これは CellPainting で行うのが最適です  これは、表示されているセルのみを含めるために最適化された方法で呼び出されるイベントです。セルごとに呼び出されることに注意してください。したがって、 e.ColumnIndex を尊重する必要があります。  および e.RowIndex  値..

    更新: 質問を明確にしたので、実際にすべてまたはすべての表示セルをループする必要があります。

    そのために呼び出すことができる関数を次に示します。

    private void markCells(DataGridView dgv, string pattern)
    {
        dgv.SuspendLayout();
        foreach (DataGridViewRow row in dgv.Rows)
            foreach (DataGridViewCell cell in row.Cells)
                cell.Style.BackColor = cell.Value.ToString() == pattern ?
                    Color.LightBlue : Color.Empty;
        dgv.ResumeLayout();
        //dgv.ClearSelection()
    }
    
    

    DGV全体をすばやく調べる場合。あなたはそれを呼び出すことができます Textbox.TextChange から  イベント。

    色の設定中にレイアウトを一時停止するため、高速でちらつきがありません。

    1つの列のみを検索する場合は、次のような追加の条件を追加できます。

    cell.Style.BackColor = cell.Value.ToString() == pattern &&  
                           cell.ColumnIndex == dgv.CurrentCell.ColumnIndex?
    
    

    また、 CellClick に入れます  出来事

あなたの答え