datagridview에서 행 색상을 변경하는 방법은 무엇입니까?


143

내 datagridview에서 특정 행의 색상을 변경하고 싶습니다. columncell 7의 값이 columncell 10의 값보다 작 으면 행이 빨간색으로 변경되어야합니다.이를 수행하는 방법에 대한 제안 사항이 있습니까?

답변:


192

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

1
도움을 주셔서 감사합니다 Ricardo. 제안한 코드를 시도했습니다. 여전히 작동하지 않습니다. 이 코드를 살펴보고 내가 잘못한 부분을 알려주시겠습니까? 저는 C #을 처음 시작하는 학생입니다. 비교 코드를 올바르게 작성하지 않았다고 확신합니다. foreach (vendorsDataGridView.Rows의 DataGridView 행) {if (row.Cells [7] .Value가 <row.Cells [10] .Value) {dataGridViewTextBoxColumn7.DefaultCellStyle.BackColor = red; }} 도움을 주셔서 감사합니다. EB
EB.

EB 제공 한 코드를 기반으로 새 코드를 추가했습니다. 귀하의 sintax가 약간 벗어났습니다. 방금 추가 한 코드를 사용해보십시오.
Ricardo Sanchez

2
리카르도 .text를 .value로 변경하고 DefaultCellstyle.Backcolor = color.red로 변경했으며 코드가 작동했습니다 !!! 시간 내 주셔서 감사합니다! EB
EB.

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
나는 모든 것이 그려 질 때까지 기다리지 않고 뿌리에서 문제를 잡는 방법을 정말로 좋아합니다. 이것은 매우 "상자 밖"접근 방식입니다. 대부분의 사람들은 오히려 모든 행을 다시 반복 할 것입니다.
bird2920

훨씬 빠를뿐만 아니라 적시에 수행하는 데 도움이됩니다. 색상이 잘못 설정되어 있기 때문에 행에 색상이 지정되지 않는 문제가있었습니다. 이 방법을 사용하면 올바른 시간에 발생합니다.
sanderd17

1
이것은 작동합니다. 또한 올바른 방식으로 새로 고침을 정렬 한 후.
macmuri

24

당신은 CellFormatting이벤트를 찾고 있습니다.
다음 은 예입니다.


2
이 접근법의 차이점은 모든 단일 셀이 하나의 셀과 비교되는 것입니다. 수백 개의 셀이 있으면 성능 문제 일 수 있습니다.
Ricardo Sanchez

21

텍스트 색상도 변경하는 데 문제가있었습니다. 색상이 변경된 것을 본 적이 없습니다.

내가 코드를 추가 할 때까지 이벤트에 텍스트 색상을 변경하기 DataBindingsComplete위해 DataGridView. 그 후 그것은 효과가있었습니다.

나는 이것이 같은 문제에 직면하는 사람들을 도울 수 있기를 바랍니다.


onLoad (..) 재정의 또는 이벤트시 텍스트 색상이 변경되지 않습니다. DataBindingsComplete는 행의 색상 설정을 수행하기에 훨씬 좋은 위치입니다.
timothy 2016 년

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

도와 주셔서 감사합니다. 귀하의 제안은 문제를 해결하는 데 가장 가깝습니다. 그러나 "값"이 컨텍스트에 존재하지 않거나 "셀"이 컨텍스트에 존재하지 않는다는 오류가 계속 발생합니다. 알아 내려고 노력 중 ...
EB.

이 코드 줄 (dgvr.Cells [7] .Value <dgvr.Cells [10] .Value)은 이제이 오류를 발생시킵니다. '<'연산자는 'object'및 'object'유형의 피연산자에 적용 할 수 없습니다
EB.

그런 다음 정수로 캐스트하십시오. :-) 같은 : Convert.ToInt32 (dvgr.Cells [7] .Value) <Convert.ToInt32 (dgvr.Cells [10] .Value)
Demi

8

어떤 사람들은 Paint, CellPainting또는 CellFormatting이벤트 를 사용하기를 원 하지만 이러한 이벤트에서 스타일을 변경하면 재귀 호출이 발생합니다. 사용 DataBindingComplete하면 한 번만 실행됩니다. 에 대한 논거 CellFormatting는 보이는 셀에서만 호출되므로 보이지 않는 셀을 포맷 할 필요는 없지만 여러 번 포맷하는 것입니다.


5

당신은 변경 할 수 있습니다 Backcolor적용 후 condition.and이 함수 호출을 사용하여 행 단위 DatasourceDatagridView.

여기 그 기능이 있습니다. 간단히 복사해서 넣습니다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

이것은 bindingDataSource를 사용하여 색상을 dataGridView로 변경하는 솔루션입니다.

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 속성을 통해 해당 콘크리트 객체를 얻을 수 있습니다. (셀에서 마술 문자열을 확인하지 않고 객체의 "실제"속성을 사용하지 않기 위해)

아래의 스켈레톤 예제 :

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

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
창 응용 프로그램에서 DatagridView를 요청합니다. 그리고 귀하의 답변은 GridView of Web에 관한 것입니다.
Pratik 1020 년

0

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

유사한 방식으로 오류 알림을 지우는 논리를 추가 할 수 있습니다.

귀하의 경우 데이터가 프로그래밍 방식으로로드되면 CellLeave 이벤트를 동일한 코드와 함께 사용할 수 있습니다.


0

이 코드를 사용하면 columname value가 null 인 행의 backcolor 만 변경하고 다른 행의 색상은 여전히 ​​기본값입니다.

       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

지구상에서 두 번째로 멍청한 개발자라면 (dumbest) 위의 모든 솔루션이 작동하는 것 같습니다 : CellFormatting, DataSourceChanged 및 RowPrePaint. RowPrePaint를 선호합니다.

선택한 행을 변경할 때 BackColor 및 ForeColor 대신 SelectionBackColor 및 SelectionForeColor를 재정의해야했기 때문에이 방법으로 너무 오래 고생했습니다.


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;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.