c# - datagridview1_cellformatting - どのようにdatagridviewで行の色を変更するには?




datagridview cellformatting c# (12)

私は、私のdatagridviewで特定の行の色を変更したいと思います。 columncell 7の値がcolumncell 10の値よりも小さい場合は、行を赤に変更する必要があります。


Visual Studio 2010で動作します(私はそれを試して、それは動作します!) あなたの行全体をペイントします。

  1. datagridviewボタンを作成します。
  2. CellClickイベントを作成し、内部に次のコード行を挿入します。
if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)    
{
    dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}

int counter = gridEstimateSales.Rows.Count;

        for (int i = 0; i < counter; i++)
        {
            if (i == counter-1)
            {
                //this is where your LAST LINE code goes
                //row.DefaultCellStyle.BackColor = Color.Yellow;
                gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.Red;
            }
            else
            {
                //this is your normal code NOT LAST LINE
                //row.DefaultCellStyle.BackColor = Color.Red;
                gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.White;
            }
        }

DefaultCellStyle.BackColor設定については、 Color.Empty以外の透明な値に設定することはできません。 これがデフォルト値です。 それは、(私にとって、とにかく)透明な色がOKであるという誤った意味です。 彼らはそうではありません。 私が透明な色に設定したすべての行は、選択された行の色を描画します。

私はこの問題で壁に頭を打つのに時間を過ごしました。


PaintCellPaintingまたはCellFormattingイベントを使用することをCellFormattingますが、これらのイベントのスタイルを変更すると再帰呼び出しが発生することに注意してください。 DataBindingCompleteを使用すると、一度だけ実行されます。 CellFormattingの引数は、可視セルでのみ呼び出されるため、非表示セルを書式設定する必要はありませんが、複数回フォーマットします。


あなたは、datagridviewの行をループし、各行の列7と10の値を比較する必要があります。

これを試して:

foreach (DataGridViewRow row in vendorsDataGridView.Rows) 
     if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) 
     {
         row.DefaultCellStyle.BackColor = Color.Red; 
     }

あなたは値がどのように変更されたかは述べていません。 私はユーザーが価値を入力しているときに同様の機能を使いました。 すなわち編集モードに入ったり離れる。

DataGridviewのCellEndEditイベントを使用しています。

private void dgMapTable_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    double newInteger;

    if (double.TryParse(dgMapTable[e.ColumnIndex,e.RowIndex].Value.ToString(), out newInteger)
    {
        if (newInteger < 0 || newInteger > 50)
        {
            dgMapTable[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red; 

            dgMapTable[e.ColumnIndex, e.RowIndex].ErrorText 
                = "Keep value in Range:" + "0 to " + "50";
        }
    }                               
}

同様の方法でエラー通知をクリアするロジックを追加することができます。

あなたのケースでは、データがプログラムによってロードされる場合、 CellLeaveイベントは同じコードで使用できます。


これは、bindingDataSourceを使用してdataGridViewに色を変更する私のソリューションです:

private void dataGridViewECO_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{            

    if (e.ListChangedType != ListChangedType.ItemDeleted)
    {

        DataGridViewCellStyle green = this.dataGridViewECO.DefaultCellStyle.Clone();
        green.BackColor = Color.Green;

        DataGridViewCellStyle gray = this.dataGridViewECO.DefaultCellStyle.Clone();
        gray.BackColor = Color.LightGray;



        foreach (DataGridViewRow r in this.dataGridViewECO.Rows)
        {

            if (r.Cells[8].Value != null)
            {

                String stato = r.Cells[8].Value.ToString();


                if (!" Open ".Equals(stato))
                {
                    r.DefaultCellStyle = gray;
                }
                else
                {
                    r.DefaultCellStyle = green;
                }
            }

        }

    }
}

セルの値が整数であると仮定すると、次のようなものがあります。

foreach (DataGridViewRow dgvr in myDGV.Rows)
{
  if (dgvr.Cells[7].Value < dgvr.Cells[10].Value)
  {
    dgvr.DefaultCellStyle.ForeColor = Color.Red;
  }
}

テストされていないので、何らかのエラーが発生しても謝ります。

特定の行がわかっている場合は、その反復をスキップできます。

if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
  dgvr.DefaultCellStyle.ForeColor = Color.Red;
}

具体的なオブジェクトの(コレクション)にバインドする場合は、その具体的なオブジェクトを行のDataBoundItemプロパティで取得できます。 (セル内のマジックストリングのチェックを避け、オブジェクトの "本当の"プロパティを使用するため)

以下のスケルトンの例:

DTO / POCO

public class Employee
{
    public int EmployeeKey {get;set;}

    public string LastName {get;set;}

    public string FirstName {get;set;}

    public bool IsActive {get;set;}
}       

データグリッドビューへのバインド

    private void BindData(ICollection<Employee> emps)
    {
        System.ComponentModel.BindingList<Employee> bindList = new System.ComponentModel.BindingList<Employee>(emps.OrderBy(emp => emp.LastName).ThenBy(emp => emp.FirstName).ToList());
        this.dgvMyDataGridView.DataSource = bindList;
    }       

イベントハンドラと具体的なオブジェクトを取得する(DataGridRowおよび/またはセルの代わりに)

        private void dgvMyDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            Employee concreteSelectedRowItem = this.dgvMyDataGridView.Rows[e.RowIndex].DataBoundItem as Employee;
            if (null != concreteSelectedRowItem && !concreteSelectedRowItem.IsActive)
            {
                dgvMyDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray;
            }
        }

私はちょうどこの問題を調査していたので(この質問はほぼ3年前に出版されたが、おそらくそれは誰かを助けるだろうが...)、 RowPrePaintイベントの中にコードを配置して、すべての行を走査しなければならず、描画されたものだけを走査しなければなりません(大量のデータでは、

イベントにアタッチする

this.dataGridView1.RowPrePaint 
    += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
        this.dataGridView1_RowPrePaint);

イベントコード

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[10].Text)) 
    {
        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
    }
}

私もテキストの色を変更するのに苦労しました - 私は色の変化を見たことはありません。

DataGridViewイベントDataBindingsCompleteテキストの色を変更するコードを追加するまでは、 その後、それは働いた。

これが同じ問題に直面している人々に役立つことを願っています。


private void dtGrdVwRFIDTags_DataSourceChanged(object sender, EventArgs e)
{
    dtGrdVwRFIDTags.Refresh();
    this.dtGrdVwRFIDTags.Columns[1].Visible = false;

    foreach (DataGridViewRow row in this.dtGrdVwRFIDTags.Rows)
    {
        if (row.Cells["TagStatus"].Value != null 
            && row.Cells["TagStatus"].Value.ToString() == "Lost" 
            || row.Cells["TagStatus"].Value != null 
            && row.Cells["TagStatus"].Value.ToString() == "Damaged" 
            || row.Cells["TagStatus"].Value != null 
            && row.Cells["TagStatus"].Value.ToString() == "Discarded")
        {
            row.DefaultCellStyle.BackColor = Color.LightGray;
            row.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold);
        }
        else
        {
            row.DefaultCellStyle.BackColor = Color.Ivory;
        }
    }  

    //for (int i= 0 ; i<dtGrdVwRFIDTags.Rows.Count - 1; i++)
    //{
    //    if (dtGrdVwRFIDTags.Rows[i].Cells[3].Value.ToString() == "Damaged")
    //    {
    //        dtGrdVwRFIDTags.Rows[i].Cells["TagStatus"].Style.BackColor = Color.Red;                   
    //    }
    //}
}




background-color