C# 如何从外部触发 DataGridView CellFormatting 事件?
C# how to fire DataGridView CellFormatting event from outside?
我有一个 DGV,它对除前 N 列(项目列)之外的所有列中的值都具有一些条件格式。前 N 列(类别列)对其余 table 具有参考值。
类似的东西:
Category1 Category2 Item1 Item2 Item3 Item4
1 2 1 2 1 2
56 57 57 56 56 56
我还有一个字典,它设置了所有列的 headers 与参考列的 headers 的对应关系。
{Item1, Category1}
{Item2, Category1}
{Item3, Category1}
{Item4, Category2}
Items1-4 的每个单元格都与 CellFormatting 事件处理程序中的相应类别(使用字典)进行比较,
然后,如果匹配,它会将单元格着色为绿色,否则 - 红色。
换句话说,在 CellFormatting 事件的处理程序中,我使用字典来检查特定列应该从 N 个引用列中获取哪些值。
现在我有一个完全独立的控件(另一个带有组合框的 DGV),允许用户更改该词典(切换每个项目所属的类别)。
我如何在更改该字典时手动引发 CellFormatting 事件?
这是我的单元格格式事件处理程序:
private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
try
{
if (e.ColumnIndex > N_of_ReferenceColumns)
{
if (e.Value.ToString() == this.dataGridView.Rows[e.RowIndex].Cells[dataGridView.Columns[convertItemToCategory(dataGridView.Columns[e.ColumnIndex].Name)].Index].Value.ToString())
{
e.CellStyle.BackColor = Color.Green;
e.CellStyle.SelectionBackColor = Color.DarkGreen;
}
else
{
e.CellStyle.BackColor = Color.Red;
e.CellStyle.SelectionBackColor = Color.DarkRed;
}
}
}
catch
{ }
}
这是我的处理程序,用于更改每个项目的类别组合框中的值:
private void DictionarydataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
UpdateDictionary(DictionarydataGridView.Rows[e.RowIndex].Cells[1].Value.ToString(), DictionarydataGridView.Rows[e.RowIndex].Cells[0].Value.ToString());
}
这就是我更新字典以及在条件格式逻辑中使用它的方式:
public static IDictionary<string, string> Dictionary = new Dictionary<string, string>();
public void UpdateDictionary(string key, string value)
{
Dictionary[key] = value;
}
public static string convertItemToCategory(string key)
{
string value = "";
if (Dictionary.TryGetValue(key.ToUpper(), out value))
{
return value;
}
else
{
return key.ToUpper();
}
}
我需要做的是在更新 Dictionary 时同时引发 CellFormatting 事件,以便根据新选择更新条件格式。
一种方法是将更新逻辑打包到一个单独的方法中,然后从每个事件处理程序中单独调用它,但我不确定如何处理所有 e.CellStyle.BackColor 等等。 ..
有什么想法吗?
一个永远不会失败的快速 hack 是通过重置数据源强制数据网格重新绑定到数据源。
此线程对以下主题进行了冗长的讨论:C# refresh DataGridView when updating or inserted on another form
您可以在表单上放置一个辅助方法:
public void Refresh()
{
datagridview1.DataSource = datagridview1.DataSource; // should re-evaluate all logic related to data bindings
datagridview1.Refresh(); // forces the control to repaint
}
这可能是最密集的解决方案,但它应该能胜任。
我有一个 DGV,它对除前 N 列(项目列)之外的所有列中的值都具有一些条件格式。前 N 列(类别列)对其余 table 具有参考值。 类似的东西:
Category1 Category2 Item1 Item2 Item3 Item4
1 2 1 2 1 2
56 57 57 56 56 56
我还有一个字典,它设置了所有列的 headers 与参考列的 headers 的对应关系。
{Item1, Category1}
{Item2, Category1}
{Item3, Category1}
{Item4, Category2}
Items1-4 的每个单元格都与 CellFormatting 事件处理程序中的相应类别(使用字典)进行比较, 然后,如果匹配,它会将单元格着色为绿色,否则 - 红色。
换句话说,在 CellFormatting 事件的处理程序中,我使用字典来检查特定列应该从 N 个引用列中获取哪些值。
现在我有一个完全独立的控件(另一个带有组合框的 DGV),允许用户更改该词典(切换每个项目所属的类别)。 我如何在更改该字典时手动引发 CellFormatting 事件?
这是我的单元格格式事件处理程序:
private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
try
{
if (e.ColumnIndex > N_of_ReferenceColumns)
{
if (e.Value.ToString() == this.dataGridView.Rows[e.RowIndex].Cells[dataGridView.Columns[convertItemToCategory(dataGridView.Columns[e.ColumnIndex].Name)].Index].Value.ToString())
{
e.CellStyle.BackColor = Color.Green;
e.CellStyle.SelectionBackColor = Color.DarkGreen;
}
else
{
e.CellStyle.BackColor = Color.Red;
e.CellStyle.SelectionBackColor = Color.DarkRed;
}
}
}
catch
{ }
}
这是我的处理程序,用于更改每个项目的类别组合框中的值:
private void DictionarydataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
UpdateDictionary(DictionarydataGridView.Rows[e.RowIndex].Cells[1].Value.ToString(), DictionarydataGridView.Rows[e.RowIndex].Cells[0].Value.ToString());
}
这就是我更新字典以及在条件格式逻辑中使用它的方式:
public static IDictionary<string, string> Dictionary = new Dictionary<string, string>();
public void UpdateDictionary(string key, string value)
{
Dictionary[key] = value;
}
public static string convertItemToCategory(string key)
{
string value = "";
if (Dictionary.TryGetValue(key.ToUpper(), out value))
{
return value;
}
else
{
return key.ToUpper();
}
}
我需要做的是在更新 Dictionary 时同时引发 CellFormatting 事件,以便根据新选择更新条件格式。
一种方法是将更新逻辑打包到一个单独的方法中,然后从每个事件处理程序中单独调用它,但我不确定如何处理所有 e.CellStyle.BackColor 等等。 ..
有什么想法吗?
一个永远不会失败的快速 hack 是通过重置数据源强制数据网格重新绑定到数据源。
此线程对以下主题进行了冗长的讨论:C# refresh DataGridView when updating or inserted on another form
您可以在表单上放置一个辅助方法:
public void Refresh()
{
datagridview1.DataSource = datagridview1.DataSource; // should re-evaluate all logic related to data bindings
datagridview1.Refresh(); // forces the control to repaint
}
这可能是最密集的解决方案,但它应该能胜任。