जवाबों:
आपको डेटाग्रिडव्यू में पंक्तियों के माध्यम से लूप करने की आवश्यकता है और फिर प्रत्येक पंक्ति पर कॉलम 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;
}
मैं सिर्फ इस मुद्दे की जांच कर रहा था (इसलिए मुझे पता है कि यह प्रश्न लगभग 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;
}
}
आप CellFormatting
घटना की तलाश कर रहे हैं ।
यहाँ एक उदाहरण है।
मुझे पाठ का रंग बदलने में भी परेशानी हुई - मैंने कभी रंग परिवर्तन नहीं देखा।
जब तक मैं कोड जोड़ा घटना के लिए पाठ रंग बदलने के लिए DataBindingsComplete
के लिए DataGridView
। उसके बाद इसने काम किया।
मुझे उम्मीद है कि इससे ऐसे ही समस्या का सामना करने वाले लोगों को मदद मिलेगी।
निम्नलिखित में से कुछ ... कोशिकाओं में मान मानने वाले इंटेगर हैं।
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;
}
कुछ लोगों का उपयोग करना चाहते Paint
, CellPainting
या CellFormatting
घटनाओं, लेकिन ध्यान दें कि इन घटनाओं में एक शैली बदलने पुनरावर्ती कॉल का कारण बनता है। यदि आप इसका उपयोग करते हैं तो DataBindingComplete
यह केवल एक बार निष्पादित होगा। इसके लिए तर्क CellFormatting
यह है कि इसे केवल दृश्य कोशिकाओं पर कहा जाता है, इसलिए आपको गैर-दृश्य कोशिकाओं को प्रारूपित करने की आवश्यकता नहीं है, लेकिन आप उन्हें कई बार प्रारूपित करते हैं।
आप 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;
}
}
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;
// }
//}
}
बाइंडिंगडेटा सोर्स से डेटाग्रिड्यू में रंग बदलने के लिए यह मेरा समाधान है:
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;
}
}
}
}
}
यदि आप ठोस वस्तुओं के संग्रह (संग्रह) से बंधते हैं, तो आप पंक्ति की DataBoundItem संपत्ति के माध्यम से उस ठोस वस्तु को प्राप्त कर सकते हैं। (सेल में जादू के तार के लिए जांच से बचने और वस्तु के "वास्तविक" गुणों का उपयोग करके)
नीचे कंकाल उदाहरण:
डीटीओ / 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;
}
}
मैं आमतौर पर इसके लिए GridView.RowDataBound इवेंट ईवेंट का उपयोग करना पसंद करता हूं।
protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.ForeColor = System.Drawing.Color.Red;
}
}
विज़ुअल स्टूडियो 2010 पर काम करता है। (मैंने इसकी कोशिश की और यह काम करता है!) यह आपकी पूरी पंक्ति को चित्रित करेगा।
datagridview
।CellClick
ईवेंट बनाएं और उसके अंदर कोड की अगली पंक्ति डालें।if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)
{
dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
आपने उल्लेख नहीं किया है कि मूल्य कैसे बदला जाता है। जब उपयोगकर्ता मूल्य दर्ज कर रहा है तो मैंने इसी तरह की कार्यक्षमता का उपयोग किया है। यानी एडिट मोड में प्रवेश करना और छोड़ना।
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";
}
}
}
आप एक समान तरीके से त्रुटि सूचना को साफ़ करने के लिए तर्क जोड़ सकते हैं।
यदि आपके मामले में, यदि प्रोग्रामेटिक रूप से डेटा लोड किया गया है, तो सेललीव इवेंट का उपयोग उसी कोड के साथ किया जा सकता है।
इस कोड के साथ, आप केवल उन पंक्तियों को backcolor में बदलते हैं, जहाँ columname value null है अन्य पंक्तियों का रंग अभी भी डिफ़ॉल्ट है।
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["columnname"].Value != null)
{
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
}
}
बस सेटिंग के बारे में एक नोट DefaultCellStyle.BackColor
... आप इसे छोड़कर किसी भी पारदर्शी मूल्य पर सेट नहीं कर सकते Color.Empty
। यही डिफ़ॉल्ट मान है। यह झूठा मतलब है (मेरे लिए, वैसे भी) कि पारदर्शी रंग ठीक हैं। वे नहीं हैं। प्रत्येक पंक्ति जो मैं पारदर्शी रंग में सेट करता हूं, वह चयनित पंक्तियों के रंग को आकर्षित करती है।
मैंने पूरी तरह से इस मुद्दे पर दीवार के खिलाफ अपना सिर पीटने में बहुत समय बिताया।
मैं यहाँ केस के लिए एक समाधान की तलाश में उतरा जहाँ मैं डेटा बाइंडिंग का उपयोग नहीं करता। मेरे लिए कुछ भी काम नहीं किया, लेकिन मुझे इसके साथ अंत में मिला:
dataGridView.Columns.Clear();
dataGridView.Rows.Clear();
dataGridView.Refresh();
यदि आप ग्रह पर दूसरे सबसे प्यारे डेवलपर हैं (मुझे सबसे बेवकूफ कहा जा रहा है), तो उपरोक्त सभी समाधान काम करने लगते हैं: सेलफार्मेटिंग, डेटा स्रोत, और रोवरपेंट। मैं रोवरपेंट पसंद करता हूं।
मैं इससे जूझ रहा था (वैसे भी बहुत लंबे समय तक) क्योंकि मुझे अपने चयन बैकऑर्डर और सिलेक्शनफॉरकलर को ओवरकॉन्डर और फोरकोलर के बजाय ओवरराइड करने की आवश्यकता थी क्योंकि मैं चयनित पंक्ति को बदल रहा था।
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;
}
}