डेटाग्रिडव्यू में रो कलर कैसे बदलें?


143

मैं अपने डेटाग्रिडव्यू में एक विशेष पंक्ति का रंग बदलना चाहूंगा। स्तंभ 7 का मान स्तंभ से कम होने पर पंक्ति को लाल रंग में बदलना चाहिए। इसे पूरा करने के बारे में कोई सुझाव?

जवाबों:


192

आपको डेटाग्रिडव्यू में पंक्तियों के माध्यम से लूप करने की आवश्यकता है और फिर प्रत्येक पंक्ति पर कॉलम 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; 
     }

1
रिकार्डो की मदद के लिए धन्यवाद। मैंने आपके द्वारा सुझाए गए कोड की कोशिश की है। मुझे अभी भी यह काम करने के लिए नहीं मिल सकता है। क्या आप इस कोड पर एक नज़र डालेंगे और मुझे बताएँगे कि मैं कहाँ गलत हो गया हूँ? मैं एक शुरुआती C # छात्र हूं। मुझे यकीन है कि मैंने अभी तुलना कोड सही नहीं लिखा है। foreach (वेंडरगेटवूड में DataGridView रो। व्यू) {if (row.Cells [ue] } } तुम्हारी सहायता सराहनीय है। ईबी
ईबी।

EB मैंने आपके द्वारा प्रदान किए गए कोड में आधारित नया कोड जोड़ा। आपका सिंटैक्स थोड़ा-सा बंद था, जो कोड मैंने अभी जोड़ा है उसे आज़माएं।
रिकार्डो सांचेज

2
रिकार्डो। मैंने .text को .value में बदल दिया और DefaultCellstyle.Backcolor = color.red में बदल गया और कोड काम कर गया !!! अपना समय देने के लिए धन्यवाद! ईबी
ईबी।

60

मैं सिर्फ इस मुद्दे की जांच कर रहा था (इसलिए मुझे पता है कि यह प्रश्न लगभग 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;
    }
}

3
मैं वास्तव में पसंद करता हूं कि आप सब कुछ चित्रित होने तक इंतजार करने के बजाय समस्या को जड़ पर कैसे पकड़ते हैं। यह एक बहुत "बॉक्स के बाहर" दृष्टिकोण है। ज्यादातर लोग बल्कि हर पंक्ति के माध्यम से फिर से लूप करेंगे ...
बर्ड2920

ज्यादा तेज होने के बाद, यह सही समय पर करने में भी मदद करता है। मेरे पास मेरी पंक्तियों के साथ रंग नहीं होने के मुद्दे थे, शायद इसलिए कि मैंने गलत समय पर रंग सेट किया। इस दृष्टिकोण के साथ, यह सही समय पर होने की गारंटी है।
सैंडरड 17

1
यह काम करता है। इसके अलावा इसके रीफ्रेशिंग को सही तरीके से करने के बाद।
मैकमुरी

24

आप CellFormattingघटना की तलाश कर रहे हैं ।
यहाँ एक उदाहरण है।


2
इस दृष्टिकोण के साथ अंतर यह है कि हर एक सेल की तुलना केवल एक के विपरीत की जाएगी। यदि आपके पास कई सौ सेल हैं तो यह एक प्रदर्शन समस्या हो सकती है।
रिकार्डो सांचेज़

21

मुझे पाठ का रंग बदलने में भी परेशानी हुई - मैंने कभी रंग परिवर्तन नहीं देखा।

जब तक मैं कोड जोड़ा घटना के लिए पाठ रंग बदलने के लिए DataBindingsCompleteके लिए DataGridView। उसके बाद इसने काम किया।

मुझे उम्मीद है कि इससे ऐसे ही समस्या का सामना करने वाले लोगों को मदद मिलेगी।


जब भी onLoad (या) ओवरराइड या ईवेंट में टेक्स्ट कॉरल डॉन्ट बदल जाता है। DataBindingsComplete पंक्तियों की रंग सेटिंग करने के लिए बहुत बेहतर जगह है।
टिमोथी

13

निम्नलिखित में से कुछ ... कोशिकाओं में मान मानने वाले इंटेगर हैं।

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

आपके सहयोग के लिए धन्यवाद। आपका सुझाव इस समस्या को हल करने के लिए सबसे करीब है। लेकिन मुझे यह कहते हुए त्रुटि मिलती रहती है कि या तो "वैल्यू" संदर्भ में मौजूद नहीं है या "सेल्स" संदर्भ में मौजूद नहीं है। यह पता लगाने की कोशिश कर रहा है ...
ईबी।

कोड की यह पंक्ति (dgvr.Cells [7] .Value <dgvr.Cells [10] .Value) अब मुझे यह त्रुटि देती है ऑपरेटर '<' टाइप 'ऑब्जेक्ट' और 'ऑब्जेक्ट' के ऑपरेंड पर लागू नहीं किया जा सकता है
EB।

उन्हें इंटीजर के लिए, फिर कास्ट करें। :-) कुछ इस तरह: Convert.ToInt32 (DVgr.Cells [7] .Value) <Convert.ToInt32 (dgvr.Cells [10] .Value)
डेमी

8

कुछ लोगों का उपयोग करना चाहते Paint, CellPaintingया CellFormattingघटनाओं, लेकिन ध्यान दें कि इन घटनाओं में एक शैली बदलने पुनरावर्ती कॉल का कारण बनता है। यदि आप इसका उपयोग करते हैं तो DataBindingCompleteयह केवल एक बार निष्पादित होगा। इसके लिए तर्क CellFormattingयह है कि इसे केवल दृश्य कोशिकाओं पर कहा जाता है, इसलिए आपको गैर-दृश्य कोशिकाओं को प्रारूपित करने की आवश्यकता नहीं है, लेकिन आप उन्हें कई बार प्रारूपित करते हैं।


5

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

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

बाइंडिंगडेटा सोर्स से डेटाग्रिड्यू में रंग बदलने के लिए यह मेरा समाधान है:

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

यदि आप ठोस वस्तुओं के संग्रह (संग्रह) से बंधते हैं, तो आप पंक्ति की 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;
            }
        }

0

मैं आमतौर पर इसके लिए GridView.RowDataBound इवेंट ईवेंट का उपयोग करना पसंद करता हूं।

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

1
उनसे Window Application में DatagridView के लिए कहा जाता है। और आपका जवाब वेब के GridView के बारे में है।
प्रतिक १०२०

0

विज़ुअल स्टूडियो 2010 पर काम करता है। (मैंने इसकी कोशिश की और यह काम करता है!) यह आपकी पूरी पंक्ति को चित्रित करेगा।

  1. के लिए एक बटन बनाएँ datagridview
  2. एक CellClickईवेंट बनाएं और उसके अंदर कोड की अगली पंक्ति डालें।

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

0

आपने उल्लेख नहीं किया है कि मूल्य कैसे बदला जाता है। जब उपयोगकर्ता मूल्य दर्ज कर रहा है तो मैंने इसी तरह की कार्यक्षमता का उपयोग किया है। यानी एडिट मोड में प्रवेश करना और छोड़ना।

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

आप एक समान तरीके से त्रुटि सूचना को साफ़ करने के लिए तर्क जोड़ सकते हैं।

यदि आपके मामले में, यदि प्रोग्रामेटिक रूप से डेटा लोड किया गया है, तो सेललीव इवेंट का उपयोग उसी कोड के साथ किया जा सकता है।


0

इस कोड के साथ, आप केवल उन पंक्तियों को backcolor में बदलते हैं, जहाँ columname value null है अन्य पंक्तियों का रंग अभी भी डिफ़ॉल्ट है।

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

0

बस सेटिंग के बारे में एक नोट DefaultCellStyle.BackColor... आप इसे छोड़कर किसी भी पारदर्शी मूल्य पर सेट नहीं कर सकते Color.Empty। यही डिफ़ॉल्ट मान है। यह झूठा मतलब है (मेरे लिए, वैसे भी) कि पारदर्शी रंग ठीक हैं। वे नहीं हैं। प्रत्येक पंक्ति जो मैं पारदर्शी रंग में सेट करता हूं, वह चयनित पंक्तियों के रंग को आकर्षित करती है।

मैंने पूरी तरह से इस मुद्दे पर दीवार के खिलाफ अपना सिर पीटने में बहुत समय बिताया।


0

मैं यहाँ केस के लिए एक समाधान की तलाश में उतरा जहाँ मैं डेटा बाइंडिंग का उपयोग नहीं करता। मेरे लिए कुछ भी काम नहीं किया, लेकिन मुझे इसके साथ अंत में मिला:

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

0

यदि आप ग्रह पर दूसरे सबसे प्यारे डेवलपर हैं (मुझे सबसे बेवकूफ कहा जा रहा है), तो उपरोक्त सभी समाधान काम करने लगते हैं: सेलफार्मेटिंग, डेटा स्रोत, और रोवरपेंट। मैं रोवरपेंट पसंद करता हूं।

मैं इससे जूझ रहा था (वैसे भी बहुत लंबे समय तक) क्योंकि मुझे अपने चयन बैकऑर्डर और सिलेक्शनफॉरकलर को ओवरकॉन्डर और फोरकोलर के बजाय ओवरराइड करने की आवश्यकता थी क्योंकि मैं चयनित पंक्ति को बदल रहा था।


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;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.