it-swarm.asia

كيفية تغيير لون الصف في datagridview؟

أرغب في تغيير لون صف معين في datagridview. يجب تغيير الصف إلى اللون الأحمر عندما تكون قيمة العمود 7 أقل من القيمة في العمود 10. أي اقتراحات حول كيفية تحقيق ذلك؟

127
EB.

تحتاج إلى حلقة خلال الصفوف في datagridview ثم مقارنة قيم الأعمدة 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; 
     }
173
Ricardo Sanchez

كنت فقط أقوم بالتحقيق في هذه المشكلة (لذلك أعلم أن هذا السؤال قد تم نشره قبل 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;
    }
}
55
Eden

أنت تبحث عن CellFormatting الحدث.
هنا مثال.

22
SLaks

أواجه مشكلة في تغيير لون النص أيضًا - لم أر تغيير اللون أبدًا.

حتى قمت بإضافة الرمز لتغيير لون النص إلى الحدث DataBindingsComplete لـ DataGridView. بعد ذلك عملت.

آمل أن يساعد هذا الأشخاص الذين يواجهون نفس المشكلة.

21
user1614017

شيء مثل التالي ... على افتراض أن القيم في الخلايا هي أعداد صحيحة.

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

يحب بعض الأشخاص استخدام الأحداث Paint أو CellPaintingCellFormatting ، لكن لاحظ أن تغيير النمط في هذه الأحداث يؤدي إلى مكالمات متكررة. إذا كنت تستخدم DataBindingComplete ، فسيتم تنفيذها مرة واحدة فقط. الحجة الخاصة بـ CellFormatting هي أنه يتم استدعاؤها فقط على الخلايا المرئية ، لذلك ليس عليك تنسيق الخلايا غير المرئية ، ولكن يمكنك تنسيقها عدة مرات.

7
Denise Skidmore

يمكنك تغيير 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;
    }
}
4
pratik1020
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;                   
    //    }
    //}
}
3
christopher

هذا هو الحل الخاص بي لتغيير اللون إلى dataGridView مع 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;
                }
            }

        }

    }
}
1
daniele3004

إذا قمت بربط (مجموعة) من الكائنات الخرسانية ، يمكنك الحصول على هذا الكائن الخرساني عبر خاصية DataBoundItem للصف. (لتجنب البحث عن سلاسل سحرية في الخلية واستخدام خصائص "حقيقية" للكائن)

مثال على الهيكل العظمي أدناه:

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

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

أنا عادة أحب لاستخدام الحدث الحدث GridView.RowDataBound لهذا الغرض.

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

باستخدام هذا الرمز ، يمكنك فقط تغيير ألوان الصفوف الخلفية حيث تكون قيمة العمود خالية من لون الصفوف الأخرى التي لا تزال هي القيمة الافتراضية.

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

مجرد ملاحظة حول إعداد DefaultCellStyle.BackColor... لا يمكنك ضبطه على أي قيمة شفافة باستثناء Color.Empty. هذه هي القيمة الافتراضية. هذا يعني كذبا (بالنسبة لي ، على أي حال) أن الألوان الشفافة على ما يرام. هم ليسوا كذلك. كل صف أقوم بتعيينه على لون شفاف يرسم فقط لون الصفوف المحددة.

قضيت الكثير من الوقت في ضرب رأسي بالجدار بسبب هذه المسألة.

0
ulatekh

وصلت إلى هنا للبحث عن حل للحالة التي لا أستخدم فيها ربط البيانات. لا شيء يعمل لي ، لكني حصلت عليه في النهاية مع:

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

لم تذكر كيف يتم تغيير القيمة. لقد استخدمت وظائف مماثلة عندما يقوم المستخدم بإدخال القيمة. أي الدخول والخروج من وضع التحرير.

باستخدام CellEndEdit حدث 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";
        }
    }                               
}

يمكنك إضافة منطق لمسح إعلام الخطأ بطريقة مماثلة.

إذا في حالتك ، إذا تم تحميل البيانات برمجيًا ، فيمكن استخدام CellLeave event مع نفس الرمز.

0
Harshal Doshi Jain

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

يعمل على Visual Studio 2010. (جربته ويعمل!) سوف يرسم صفك بالكامل.

  1. قم بإنشاء زر لـ datagridview.
  2. قم بإنشاء حدث CellClick ووضع السطر التالي من التعليمات البرمجية داخله.

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