datagridviewの行の色を変更する方法は?


143

データグリッドビューの特定の行の色を変更したいと思います。列セル7の値が列セル10の値より小さい場合、行を赤に変更する必要があります。これを達成する方法について何か提案はありますか?

回答:


192

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

1
リカルドを助けてくれてありがとう。あなたが提案したコードを試しました。それでも動作しません。このコードを見て、どこが間違っているのか教えていただけませんか。私はC#の初心者です。比較コードを正しく記述していないと思います。foreach(vendorsDataGridView.RowsのDataGridView行){if(row.Cells [7] .Value is <row.Cells [10] .Value){dataGridViewTextBoxColumn7.DefaultCellStyle.BackColor = red; } } 私はあなたの助けに感謝します。EB
EB。

EBあなたが提供したコードに基づいて新しいコードを追加しました。シンタックスは少しずれていました。先ほど追加したコードを試してください。
Ricardo Sanchez、

2
リカルド。.textを.valueに変更し、DefaultCellstyle.Backcolor = color.redに変更すると、コードが機能しました!!! お時間をいただきありがとうございます!EB
EB。

60

私はこの問題を調査していました(そのため、この質問がほぼ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;
    }
}

3
すべてがペイントされるまで待つのではなく、問題を根本から捉える方法が本当に好きです。これは非常に「すぐに使える」アプローチです。ほとんどの人はむしろすべての行をもう一度ループするだけです...
bird2920

はるかに高速であるだけでなく、適切なタイミングでそれを実行するのにも役立ちます。おそらく色を間違って設定したためか、行が色付けされないという問題がありました。このアプローチにより、適切なタイミングで発生することが保証されます。
sanderd17

1
これはうまくいきます。また、そのさわやかさを正しい方法で並べ替えた後。
macmuri

24

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


2
このアプローチとの違いは、1つのセルだけではなく、すべてのセルが比較されることです。セルが数百ある場合は、パフォーマンスの問題になる可能性があります。
リカルドサンチェス

21

テキストの色も変更できませんでした。色の変更を見たことがありません。

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

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


onLoad(..)オーバーライドまたはイベントでは、テキスト列は変更されません。DataBindingsCompleteは、行の色設定を行うためのより良い場所です。
timothy 2015年

13

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

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

ご協力ありがとうございました。あなたの提案は私が問題を解決するために得た最も近いものです。しかし、「値」がコンテキスト内に存在しない、または「セル」がコンテキスト内に存在しないというエラーが発生し続けます。それを理解しようとしています...
EB。

このコード行(dgvr.Cells [7] .Value <dgvr.Cells [10] .Value)により、このエラーが発生します演算子 '<'は、タイプ 'object'および 'object'のオペランドに適用できません
EB。

次に、整数にキャストします。:-)のようなもの:Convert.ToInt32(dvgr.Cells [7] .Value)<Convert.ToInt32(dgvr.Cells [10] .Value)
デミ

8

一部の人々はPaintCellPaintingまたはCellFormattingイベントを使用したいが、これらのイベントのスタイルを変更すると、再帰呼び出しが発生することに注意してください。使用DataBindingCompleteすると、1回だけ実行されます。の議論CellFormattingは、可視セルでのみ呼び出されるため、非可視セルをフォーマットする必要はなく、複数回フォーマットすることです。


5

Backcolor条件を使用して行ごとに変更できます。この関数呼び出しDatasourceは、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;
    }
}

3
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;                   
    //    }
    //}
}

2

これは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

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

0

私は通常、GridView.RowDataBoundイベントイベントを使用するのが好きです。

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

1
彼はウィンドウアプリケーションでDatagridViewを要求されます。そしてあなたの答えはWebのGridViewについてです。
Pratik 1020 2014年

0

Visual Studio 2010で動作します。(試してみましたが動作します!) 行全体が描画されます。

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

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

0

値がどのように変更されるかについては言及していません。ユーザーが値を入力するときにも、同様の機能を使用しました。つまり、編集モードの開始と終了。

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イベントは同じコードで使用できます。


0

このコードでは、列の値がnullである行の背景色のみを変更し、他の行の色はデフォルトのままです。

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

0

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

私はこの問題について壁に頭を叩くのにまったく多くの時間を費やしました。


0

私はデータバインディングを使用しない場合の解決策を探してここに着陸しました。何もうまくいきませんでしたが、最終的には次のようになりました。

dataGridView.Columns.Clear(); 
dataGridView.Rows.Clear();
dataGridView.Refresh();

0

あなたが地球で2番目に愚かな開発者である場合(私は最も愚かです)、上記のすべての解決策(CellFormatting、DataSourceChanged、およびRowPrePaint)が機能するようです。RowPrePaintのほうが好きです。

選択した行を変更するときに、BackColorとForeColorではなく、SelectionBackColorとSelectionForeColorをオーバーライドする必要があったため、私はこれに(長すぎて)苦労しました。


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;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.