Jawaban:
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;
}
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 RowPrePaint
acara 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;
}
}
Anda sedang mencari CellFormatting
acara tersebut.
Berikut ini sebuah contoh.
Saya kesulitan mengubah warna teks juga - Saya tidak pernah melihat perubahan warna.
Sampai saya menambahkan kode untuk mengubah warna teks ke acara DataBindingsComplete
untuk DataGridView
. Setelah itu berhasil.
Saya harap ini akan membantu orang yang menghadapi masalah yang sama.
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;
}
Beberapa orang suka menggunakan Paint
, CellPainting
atau CellFormatting
acara, tetapi perhatikan bahwa mengubah gaya dalam acara ini menyebabkan panggilan rekursif. Jika Anda menggunakannya DataBindingComplete
hanya akan dijalankan sekali. Argumennya CellFormatting
adalah ia dipanggil hanya pada sel yang terlihat, jadi Anda tidak harus memformat sel yang tidak terlihat, tetapi Anda memformatnya beberapa kali.
Anda dapat Ubah Backcolor
baris demi baris menggunakan condition.and Anda fungsi panggilan ini setelah menerapkan Datasource
dari 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;
}
}
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;
// }
//}
}
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;
}
}
}
}
}
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;
}
}
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;
}
}
Bekerja pada Visual Studio 2010. (Saya mencobanya dan berhasil!) Ini akan melukis seluruh baris Anda.
datagridview
.CellClick
acara dan letakkan baris kode berikutnya di dalamnya.if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)
{
dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
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.
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;
}
}
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.
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();
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.
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;
}
}