답변:
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;
}
방금이 문제를 조사하고 있었으므로 (이 질문은 거의 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
적용 후 condition.and이 함수 호출을 사용하여 행 단위 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;
// }
//}
}
이것은 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;
}
}
}
}
}
콘크리트 객체의 (컬렉션)에 바인딩하면 행의 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;
}
}
일반적으로 GridView.RowDataBound 이벤트 이벤트를 사용하는 것이 좋습니다.
protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.ForeColor = System.Drawing.Color.Red;
}
}
가치가 어떻게 변하는 지 언급하지 않았습니다. 사용자가 가치를 입력 할 때 비슷한 기능을 사용했습니다. 즉, 편집 모드를 시작하고 종료합니다.
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 이벤트를 동일한 코드와 함께 사용할 수 있습니다.
이 코드를 사용하면 columname value가 null 인 행의 backcolor 만 변경하고 다른 행의 색상은 여전히 기본값입니다.
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["columnname"].Value != null)
{
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
}
}
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;
}
}