Datagridview'da satır rengi nasıl değiştirilir?


143

Datagridview içinde belirli bir satırın rengini değiştirmek istiyorum. Sütun hücresi 7'nin değeri sütun hücresi 10'daki değerden düşük olduğunda sıra kırmızıya dönüştürülmelidir. Bunun nasıl yapılacağı konusunda herhangi bir öneriniz var mı?

Yanıtlar:


192

Datagridview satırları arasında döngü ve sonra her satırda 7 ve 10 sütun değerlerini karşılaştırmanız gerekir.

Bunu dene:

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
Yardımın için teşekkürler Ricardo. Önerdiğiniz kodu denedim. Hala işe yarayamıyorum. Bu koda bir göz atabilir ve bana nerede yanlış gittiğimi söyler misiniz? Ben bir başlangıç ​​C # öğrencisiyim. Eminim karşılaştırma kodunu doğru yazmadım. foreach (vendorsDataGridView.Rows içindeki DataGridView satırı) {if (row.Cells [7] .Değer <row.Cells [10] .Value) {dataGridViewTextBoxColumn7.DefaultCellStyle.BackColor = kırmızı; }} Yardımınız için teşekkür ederim. EB
EB.

EB Sağladığınız koda göre yeni bir kod ekledim. Sintaksınız biraz kapalıydı, yukarıda eklediğim kodu deneyin.
Ricardo Sanchez

2
Ricardo. .Text değerini .value olarak değiştirdim ve DefaultCellstyle.Backcolor = color.red olarak değiştirdim ve kod çalıştı !!! Zaman ayırdığın için teşekkürler! EB
EB.

60

Ben sadece bu sorunu araştırıyordum (bu yüzden bu sorunun neredeyse 3 yıl önce yayınlandığını biliyorum, ama belki birine yardımcı olacak ...) ama daha iyi bir seçenek kodu içine yerleştirmek gibi görünüyor RowPrePaint olay böylece her satırdan geçmek zorundasınız, sadece boyananlar (böylece büyük miktarda veri üzerinde çok daha iyi performans gösterecektir:

Etkinliğe ekle

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

Olay kodu

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
Her şeyi boyanana kadar beklemek yerine sorunu kökten nasıl yakaladığınızı gerçekten çok seviyorum. Bu çok "kutunun dışında" bir yaklaşımdır. Çoğu insan her satırda tekrar döngü yapmayı tercih eder ...
bird2920

Çok daha hızlı olmasının yanı sıra, doğru zamanda yapılmasına da yardımcı olur. Muhtemelen rengi yanlış zamanda ayarladığım için satırlarımın renklenmemesi ile ilgili sorunlar yaşadım. Bu yaklaşımla, doğru zamanda gerçekleşmesi garanti edilir.
sanderd17

1
Bu geat çalışır. Ayrıca tazelenmesini doğru şekilde sıraladıktan sonra.
macmuri

24

CellFormattingEtkinliği arıyorsunuz .
İşte bir örnek.


2
Bu yaklaşımdaki fark, her bir hücrenin sadece bir hücrenin aksine karşılaştırılmasıdır. Birkaç yüz hücreniz varsa bir performans sorunu olabilir.
Ricardo Sanchez

21

Metin rengini de değiştirmekte zorlandım - renk değişikliğini hiç görmedim.

Ben olaya metin rengini değiştirmek için kod eklemiş Kadar DataBindingsCompleteiçinDataGridView . Bundan sonra işe yaradı.

Umarım bu aynı problemle karşılaşan insanlara yardımcı olur.


onLoad (..) geçersiz kılma veya olaydayken metin rengi değişmez. DataBindingsComplete, satırların renk ayarını yapmak için çok daha iyi bir yerdir.
timothy

13

Aşağıdaki gibi bir şey ... hücrelerdeki değerlerin Tamsayı olduğunu varsayarsak.

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

denenmemiş, bu yüzden herhangi bir hata için özür dileriz.

Belirli bir satırı biliyorsanız, yinelemeyi atlayabilirsiniz:

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

Yardımın için teşekkürler. Önerin, sorunu çözmek için en yakın olanı. Ancak "Değer" in bağlamda veya "Hücreler" in bağlamda mevcut olmadığını söyleyerek hatayı almaya devam ediyorum. Anlamaya çalışıyorum ...
EB.

bu kod satırı (dgvr.Cells [7] .Value <dgvr.Cells [10] .Value) şimdi bu hatayı veriyor 'Operatör' <',' object 've' object '
EB

Onları tamsayıya çevirin. :-) gibi bir şey: Convert.ToInt32 (dvgr.Cells [7] .Value) <Convert.ToInt32 (dgvr.Cells [10] .Value)
Demi

8

Bazı insanlar Paint, CellPaintingveya CellFormattingetkinliklerini kullanmayı sever , ancak bu etkinliklerde stil değiştirmenin yinelemeli çağrılara neden olduğunu unutmayın. Eğer kullanırsanız DataBindingComplete, yalnızca bir kez çalıştırır. Argümanı CellFormatting, yalnızca görünür hücrelerde çağrılmasıdır, bu nedenle görünür olmayan hücreleri biçimlendirmenize gerek yoktur, ancak bunları birden çok kez biçimlendirirsiniz.


5

Sen değiştirme yapabilirsiniz Backcoloruyguladıktan sonra condition.and bu fonksiyon çağrısı kullanarak satır temelinde Datasourcearasında DatagridView.

İşte bunun için bir işlev. Sadece kopyalayın ve sonra koyunDatabind

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

Bu bağlamaDataSource ile dataGridView rengini değiştirmek için benim çözümdür:

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

Somut nesnelerin (koleksiyonuna) bağlanırsanız, o somut nesneyi satırın DataBoundItem özelliği aracılığıyla alabilirsiniz. (Hücredeki sihirli dizeleri kontrol etmek ve nesnenin "gerçek" özelliklerini kullanmaktan kaçınmak için)

Aşağıdaki iskelet örneği:

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'e bağlanma

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

sonra olay işleyici ve somut nesneyi alma (DataGridRow ve / veya hücreler yerine)

        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

Genellikle bunun için GridView.RowDataBound Olay olayı kullanmak istiyorum.

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

1
Pencere Uygulamasında DatagridView isteniyor. Ve cevabınız GridView of Web hakkında.
Pratik 1020

0

Visual Studio 2010 üzerinde çalışır. (Denedim ve işe yarıyor!) Tüm satırınızı boyayacak.

  1. İçin bir düğme oluşturun datagridview .
  2. Bir CellClicketkinlik oluşturun ve bir sonraki kod satırını içine yerleştirin.

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

0

Değerin nasıl değiştirildiğinden bahsetmediniz. Kullanıcı değer girerken benzer işlevleri kullandım. yani düzenleme moduna girip çıkmak.

Datagridview CellEndEdit olayını kullanma .

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

Hata bildirimini benzer şekilde temizlemek için mantık ekleyebilirsiniz.

sizin durumunuzda, veriler programlı olarak yüklenirse, CellLeave olayı aynı kodla kullanılabilir.


0

Bu kodla, yalnızca sütun adı değerinin null olduğu satırların rengini değiştirirsiniz, diğer satırların rengi hala varsayılan değerdir.

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

0

Sadece ayar hakkında bir not DefaultCellStyle.BackColor... bunu saydam bir değere ayarlayamazsınız.Color.Empty . Bu varsayılan değerdir. Bu, yanlış renklerin (bana göre, zaten) şeffaf renklerin iyi olduğunu ima eder. Onlar değil. Saydam bir renge ayarladığım her satır, seçilen satırların rengini çizer.

Bu konuda kafamı duvara dayamak için çok fazla zaman harcadım.


0

Buraya veri bağlama kullanmadığım bir durum için bir çözüm aradım. Hiçbir şey benim için işe yaramadı ama sonunda aldım:

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

0

Gezegendeki ikinci en aptal geliştiriciyseniz (ben en aptalım), yukarıdaki çözümlerin hepsi işe yarıyor gibi görünüyor: CellFormatting, DataSourceChanged ve RowPrePaint. RowPrePaint'i tercih ederim.

Ben seçili satır değiştirirken BackColor ve ForeColor yerine benim SelectionBackColor ve SelectionForeColor geçersiz kılmak gerekiyordu çünkü bu (çok yol için) ile mücadele etti.


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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.