web-dev-qa-db-ja.com

datagridviewで行の色を変更する方法

Datagridviewで特定の行の色を変更したいです。 columncell 7の値がcolumncell 10の値よりも小さい場合、行を赤に変更する必要があります。これを達成する方法について何か提案はありますか?

127
EB.

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; 
     }
174
Ricardo Sanchez

私はこの問題を調査していたところなので(この質問はほぼ3年前に公開されていましたが、誰かに役立つかもしれませんが…)、コードをRowPrePaintイベント内に配置するのが賢明です。 tすべての行をトラバースする必要があります。ペイントされた行だけを処理する必要があります。

イベントに添付

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;
    }
}
55
Eden

CellFormatting イベントを探しています。
ここ は一例です。

22
SLaks

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

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

私はこれが同じ問題に直面する人々を助けることを願っています。

21
user1614017

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

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;
}
13
Demi

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

7
Denise Skidmore

BackcolorDatasourceを適用した後、DatagridViewを自分の条件で行単位で変更することができます。

これがそのための関数です。単にそれをコピーしてDatabindの後に置くだけです。

private void ChangeRowColor()
{
    for (int i = 0; i < gvItem.Rows.Count; i++)
    {
        if (BindList[i].MainID == 0 && !BindList[i].SchemeID.HasValue)
            gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#C9CADD");
        else if (BindList[i].MainID > 0 && !BindList[i].SchemeID.HasValue)
            gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#DDC9C9");
        else if (BindList[i].MainID > 0)
            gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#D5E8D7");
        else
            gvItem.Rows[i].DefaultCellStyle.BackColor = Color.White;
    }
}
5
pratik1020
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;                   
    //    }
    //}
}
3
christopher

これは、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;
                }
            }

        }

    }
}
1
daniele3004

具象オブジェクトの(コレクション)にバインドすると、行の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;}
}       

Datagridviewへのバインド

    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;
            }
        }
1
granadaCoder

私は通常GridView.RowDataBoundイベントイベントをこれに使うのが好きです。

protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.ForeColor = System.Drawing.Color.Red;
    }
}
0
Edison

このコードでは、列名の値がnullである行のバックカラーのみを変更し、他の行の色はデフォルトのままです。

       foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells["columnname"].Value != null)
                    {
                        dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
                    }
                 }
0
bencemik95

DefaultCellStyle.BackColor...を設定することについての単なるメモ。Color.Empty以外の透明な値に設定することはできません。これがデフォルト値です。それは、透明な色が問題ないことを(私にはとにかく)誤って暗示しています。そうではありません。透明色に設定した各行は、選択された行の色だけを描画します。

私はこの問題で壁に頭をぶつけたのに全く時間をかけすぎました。

0
ulatekh

データバインディングを使用しない場合の解決策を探して、ここに着陸しました。私には何も機能しませんでしたが、私は最後にそれを得ました:

dataGridView.Columns.Clear(); 
dataGridView.Rows.Clear();
dataGridView.Refresh();
0
Gogu CelMare

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

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 eventは同じコードで使われることができます。

0

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;
            }
        }
0
Amit Patil

Visual Studio 2010で動作します。(試してみましたが、動作します!)行全体がペイントされます。

  1. datagridviewのボタンを作成します。
  2. CellClickイベントを作成し、その中に次のコード行を入れます。

if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)    
{
    dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
0
Levi