Yanıtlar:
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;
}
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;
}
}
CellFormatting
Etkinliği arıyorsunuz .
İşte bir örnek.
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 DataBindingsComplete
içinDataGridView
. Bundan sonra işe yaradı.
Umarım bu aynı problemle karşılaşan insanlara yardımcı olur.
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;
}
Bazı insanlar Paint
, CellPainting
veya CellFormatting
etkinliklerini 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.
Sen değiştirme yapabilirsiniz Backcolor
uyguladıktan sonra condition.and bu fonksiyon çağrısı kullanarak satır temelinde Datasource
arası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;
}
}
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;
// }
//}
}
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;
}
}
}
}
}
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;
}
}
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;
}
}
Visual Studio 2010 üzerinde çalışır. (Denedim ve işe yarıyor!) Tüm satırınızı boyayacak.
datagridview
.CellClick
etkinlik 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;
}
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.
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;
}
}
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.
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();
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.
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;
}
}