내가 뭘하는지는 두 데이터 테이블을 비교하여 변경 사항을 확인하는 것입니다. 표 셀 값이 변경되면 BackColor 속성을 변경하여 해당 DataGridView 셀을 표시합니다. 이것은 DataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True 및 DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells를 설정해야 할 때까지 완벽하게 작동했습니다. 텍스트를 셀 안의 새 줄로 옮길 수 있도록이 작업을 수행해야했습니다. Here이 설명 StackOverflow 답변입니다. 그래서 DefaultCellStyle을 설정 한 후에는 BackColor를 변경할 수 없었습니다. 그러나 DataGridViewCell을 전달하고 값의 유효성을 검사하는 Validator 클래스가 있습니다. 셀의 텍스트가 유효하지 않거나 올바른 형식이면 Style.BackColor가 변경됩니다 ...이 작동합니다! 내 질문에 왜 내 Validator 클래스 BackColor 변경할 수 있지만 양식에서 직접 수 없습니다? 다음의 간단한 예는 내가 뭐하는 거지와 제가 경험하고있다 :DataGridView DefaultCellStyle BackColor 변경 방지
여기private void initDataGridView()
{
DataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
DataGridView.MultiSelect = false;
DataGridView.AllowUserToAddRows = false;
DataGridView.AllowUserToDeleteRows = false;
DataGridView.RowHeadersVisible = false;
// ADD EVENT HANDLERS
DataGridView.CellEndEdit += DataGridView_CellEndEdit;
}
private void compareTables()
{
string dataTableCell;
string dataTableMirrorCell;
for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
{
for (int colIndex = 2; colIndex < dataTable.Columns.Count; colIndex++)
{
// initialize cell values to compare
dataTableCell = dataTable.Rows[rowIndex].Field<string>(colIndex);
dataTableMirrorCell = dataTableMirror.Rows[rowIndex].Field<string>(colIndex);
// now compare cell values
if (dataTableCell != dataTableMirrorCell)
{
if (dataTableCell== null
|| dataTableCell== string.Empty)
{
dataGridView.Rows[rowIndex].Cells[colIndex].Style.BackColor = Color.Red;
dataGridView.Rows[rowIndex].Cells[colIndex].Tag = "Delete";
}
else
{
if (dataTableMirrorCell == null
|| dataTableMirrorCell == string.Empty)
{
dataGridView.Rows[rowIndex].Cells[colIndex].Style.BackColor = Color.Orange;
dataGridView.Rows[rowIndex].Cells[colIndex].Tag = "Add";
}
else
{
dataGridView.Rows[rowIndex].Cells[colIndex].Style.BackColor = Color.Yellow;
dataGridView.Rows[rowIndex].Cells[colIndex].Tag = "Change";
}
}
}
}
}
}
private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
Validator validator = new Validator(this);
if (e.ColumnIndex != dgv.Columns["Name"].Index)
{
DataGridViewCell cell = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
// Check the value for valid format
validator.validateCell(cell, ValidationType.Numeric);
}
}
가 Validator.validateCell 방법입니다 :
이public void validateCell(DataGridViewCell cell, String type)
{
// NUMERIC
if (type.ToLower() == "numeric")
{
int result;
if (!int.TryParse(cell.Value.ToString(), out result))
{
cell.Style.BackColor = Color.Beige;
cell.Style.Font = new Font(this.form.Font, FontStyle.Bold);
cell.ToolTipText = "This is a " + type + " only field.";
cell.Tag = "invalid";
}
else
{
cell.Style.BackColor = Color.White;
cell.Style.Font = new Font(this.form.Font, FontStyle.Regular);
cell.ToolTipText = string.Empty;
cell.Tag = "valid";
}
}
}
Validator.validateCell WORKS, 그것은 셀의 BackColor과 변화 세례반. 누군가가 왜 로컬 메소드 compareTables가 BackColor를 변경하지 않고 내 validator.validateCell이 변경되는지를 설명 할 수 있습니까? 내가 배울 수 있도록 도와 주신 것에 대해 많은 감사를드립니다!
답장을 보내 주셔서 감사합니다! 글쎄, 이건 내가하려는 일이 아니야. RowsDefaultCellStyle.SelectionBackColor를 사용하면 현재 선택한 셀의 색상이 변경됩니다. 내가 원하는 것은 변경된 셀의 BackColor를 변경하는 것입니다. – waltmagic
@wailmagic FormattingEvent를 설정해야 할 수도 있습니다. http://stackoverflow.com/questions/16105718/datagridview-changing-cell-background-color – Luk6e
DGV에서 셀 서식을 지정하기 전에 CellFormatting 이벤트를 사용했습니다. CellFormatting을 사용하여 솔루션을 찾을 수 있는지 실험 해 보겠습니다. 내가 답하면 내 해결책을 다시보고 할 것입니다. 고마워요 Luk6e Logged – waltmagic