Bagaimana cara mengubah warna baris dalam datagridview?

143

Saya ingin mengubah warna baris tertentu di datagridview saya. Baris harus diubah menjadi merah ketika nilai columncell 7 kurang dari nilai di columncell 10. Ada saran tentang cara menyelesaikan ini?

EB.
sumber

Jawaban:

192

Anda perlu mengulang-ulang baris di datagridview dan kemudian membandingkan nilai kolom 7 dan 10 pada setiap baris.

Coba ini:

foreach (DataGridViewRow row in vendorsDataGridView.Rows) 
     if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) 
     {
         row.DefaultCellStyle.BackColor = Color.Red; 
     }
Ricardo Sanchez
sumber
1
Terima kasih atas bantuannya Ricardo. Saya telah mencoba kode yang Anda sarankan. Saya masih belum bisa membuatnya bekerja. Maukah Anda melihat kode ini dan memberi tahu saya di mana kesalahan saya? Saya seorang siswa C # pemula. Saya yakin saya belum menulis kode perbandingan dengan benar. foreach (baris DataGridView di vendorDataGridView.Rows) {if (row.Cells [7] .Nilai adalah <row.Cells [10] .Value) {dataGridViewTextBoxColumn7.DefaultCellStyle.BackColor = red; } } Saya menghargai bantuan Anda. EB
EB.
EB Saya menambahkan kode baru berdasarkan kode yang Anda berikan. Sintaks Anda tidak aktif sedikit, coba kode yang baru saja saya tambahkan di atas.
Ricardo Sanchez
2
Ricardo. Saya mengubah .text menjadi .value dan berubah menjadi DefaultCellstyle.Backcolor = color.red dan kode berfungsi !!! Terima kasih atas waktu Anda! EB
EB.
60

Saya baru saja menyelidiki masalah ini (jadi saya tahu pertanyaan ini diterbitkan hampir 3 tahun yang lalu, tapi mungkin itu akan membantu seseorang ...) tetapi tampaknya pilihan yang lebih baik adalah menempatkan kode di dalam RowPrePaintacara sehingga Anda tidak harus melintasi setiap baris, hanya yang dilukis (sehingga akan bekerja lebih baik pada sejumlah besar data:

Lampirkan ke acara tersebut

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

Kode acara

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;
    }
}
Eden
sumber
3
Saya sangat suka bagaimana Anda menangkap masalah di root alih-alih menunggu sampai semuanya telah dicat. Ini adalah pendekatan yang sangat "di luar kotak". Kebanyakan orang lebih suka hanya mengulangi setiap baris lagi ...
bird2920
Selain lebih cepat, ini juga membantu melakukannya pada waktu yang tepat. Saya memiliki masalah dengan baris saya tidak menjadi berwarna, mungkin karena saya mengatur warna pada waktu yang salah. Dengan pendekatan ini, dijamin terjadi pada waktu yang tepat.
sanderd17
1
Ini berfungsi. Juga setelah mengurutkannya menyegarkan dengan cara yang benar.
macmuri
24

Anda sedang mencari CellFormattingacara tersebut.
Berikut ini sebuah contoh.

Slaks
sumber
2
Perbedaannya dengan pendekatan ini adalah bahwa setiap sel tunggal akan dibandingkan bukan hanya satu. Ini mungkin masalah kinerja jika Anda memiliki beberapa ratus sel.
Ricardo Sanchez
21

Saya kesulitan mengubah warna teks juga - Saya tidak pernah melihat perubahan warna.

Sampai saya menambahkan kode untuk mengubah warna teks ke acara DataBindingsCompleteuntuk DataGridView. Setelah itu berhasil.

Saya harap ini akan membantu orang yang menghadapi masalah yang sama.

pengguna1614017
sumber
text coulour tidak berubah ketika di onLoad (..) timpa atau acara. DataBindingsComplete adalah tempat yang jauh lebih baik untuk melakukan pengaturan warna baris.
timothy
13

Sesuatu seperti yang berikut ... dengan asumsi nilai dalam sel adalah Integer.

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

belum diuji, mohon maaf atas kesalahan apa pun.

Jika Anda tahu baris tertentu, Anda dapat melewati iterasi:

if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
  dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
Demi
sumber
Terima kasih untuk bantuannya. Saran Anda adalah yang paling dekat yang saya miliki untuk menyelesaikan masalah. Tapi saya terus mendapatkan kesalahan dengan mengatakan "Nilai" tidak ada dalam konteks atau "Sel" tidak ada dalam konteks. Mencoba mencari tahu ...
EB.
baris kode ini (dgvr.Cell [7] .Nilai <dgvr.Cell [10] .Nilai) sekarang memberi saya kesalahan ini Operator '<' tidak dapat diterapkan ke operan tipe 'objek' dan 'objek'
EB.
Keluarkan mereka ke Integer, lalu. :-) sesuatu seperti: Convert.ToInt32 (dvgr.Cells [7] .Value) <Convert.ToInt32 (dgvr.Cells [10] .Value)
Demi
8

Beberapa orang suka menggunakan Paint, CellPaintingatau CellFormattingacara, tetapi perhatikan bahwa mengubah gaya dalam acara ini menyebabkan panggilan rekursif. Jika Anda menggunakannya DataBindingCompletehanya akan dijalankan sekali. Argumennya CellFormattingadalah ia dipanggil hanya pada sel yang terlihat, jadi Anda tidak harus memformat sel yang tidak terlihat, tetapi Anda memformatnya beberapa kali.

Denise Skidmore
sumber
5

Anda dapat Ubah Backcolorbaris demi baris menggunakan condition.and Anda fungsi panggilan ini setelah menerapkan Datasourcedari DatagridView.

Inilah fungsinya untuk itu. Cukup salin dan letakkan setelah ituDatabind

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;
    }
}
Pratik 1020
sumber
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;                   
    //    }
    //}
}
christopher
sumber
2

Ini solusi saya untuk mengubah warna ke dataGridView dengan bindingDataSource:

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

        }

    }
}
daniele3004
sumber
1

Jika Anda mengikat ke (koleksi) objek beton, Anda bisa mendapatkan objek konkret melalui properti DataBoundItem dari baris. (Untuk menghindari memeriksa string ajaib dalam sel dan menggunakan properti "nyata" objek)

Contoh kerangka di bawah ini:

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

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

kemudian event handler dan mendapatkan objek konkret (bukan DataGridRow dan / atau sel)

        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;
            }
        }
granadaCoder
sumber
0

Saya biasanya suka menggunakan acara Event GridView.RowDataBound untuk ini.

protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.ForeColor = System.Drawing.Color.Red;
    }
}
Edison
sumber
1
Dia diminta untuk DatagridView di Aplikasi Jendela. Dan jawaban Anda adalah tentang GridView of Web.
Pratik 1020
0

Bekerja pada Visual Studio 2010. (Saya mencobanya dan berhasil!) Ini akan melukis seluruh baris Anda.

  1. Buat tombol untuk datagridview.
  2. Buat CellClickacara dan letakkan baris kode berikutnya di dalamnya.

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

Anda belum menyebutkan bagaimana nilai diubah. Saya telah menggunakan fungsi serupa ketika pengguna memasukkan nilai. yaitu memasuki dan meninggalkan mode edit.

Menggunakan acara CellEndEdit dari datagridview.

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

Anda dapat menambahkan logika untuk menghapus pemberitahuan kesalahan dengan cara yang sama.

jika dalam kasus Anda, jika data dimuat secara terprogram, maka acara CellLeave dapat digunakan dengan kode yang sama.

Harshal Doshi Jain
sumber
0

Dengan kode ini, Anda hanya mengubah baris backcolor di mana nilai nama kolom adalah nol, sedangkan warna baris lainnya masih merupakan default.

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

Hanya catatan tentang pengaturan DefaultCellStyle.BackColor... Anda tidak dapat mengaturnya ke nilai transparan apa pun kecuali Color.Empty. Itu nilai default. Itu secara tidak langsung menyiratkan (bagi saya, bagaimanapun) bahwa warna-warna transparan itu OK. Mereka tidak. Setiap baris yang saya atur ke warna transparan hanya menggambar warna baris yang dipilih.

Saya menghabiskan terlalu banyak waktu membenturkan kepala ke dinding karena masalah ini.

ulatekh
sumber
0

Saya mendarat di sini mencari solusi untuk kasus di mana saya tidak menggunakan data binding. Tidak ada yang berhasil untuk saya, tetapi pada akhirnya saya berhasil dengan:

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

Jika Anda adalah pengembang terbodoh kedua di planet ini (saya menjadi yang paling bodoh), semua solusi di atas tampaknya bekerja: CellFormatting, DataSourceChanged, dan RowPrePaint. Saya lebih suka RowPrePaint.

Saya berjuang dengan ini (terlalu lama) karena saya perlu mengganti SelectionBackColor dan SelectionForeColor saya alih-alih BackColor dan ForeColor ketika saya mengubah baris yang dipilih.

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