根据excel表中的值获取单元格范围/位置,并在c#中为单元格数据网格视图上色



我正在数据网格视图中显示导入的excel工作表。根据行名,我将替换特定的单元格字符串。现在我想根据它们的值给特定的单元格上色。

private void Replace_strings()
{
TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;
DataTable dt = dataGridView1.DataSource as DataTable;
foreach (DataRow r in dt.Select("[SET 1] = 'First Name'"))
for (int y = 1; y < r.ItemArray.Length; y++)
{
String str = r[y].ToString();
r[y] = str.Replace('0', 'o');
r[y] = textInfo.ToUpper(r[y].ToString());
if (r[y].ToString().Contains("%"))
{
//If a cell contains "%"I want to mark that cell in red colour
//CellStyle.BackColor = Color.Red;
//CellStyle.ForeColor = Color.White;

}
}
}

如何有效更正此

预期

点击查看预期输出图像

有很多方法可以做到这一点。我会遍历"网格"而不是数据源。DataTable包含数据,但"网格"显示数据。因此,您要更改颜色的是"网格",而不是数据表。

然而,如果您连接了几个网格事件,则可能不需要在网格中循环。

网格中有许多可以使用的"CellFormatting/Paining"事件,但是,您需要小心使用哪一个。即使单元格值没有更改,这些事件中的大多数也会经常被触发。换句话说,如果网格因为滚动而被重新绘制,那么重新格式化单元格是徒劳的,因为它没有改变。

鉴于此,我建议您连接网格的两(2(个事件…CellEndEdit事件。。。当单元格值发生更改并且用户试图离开单元格时,将触发此事件。当此事件触发时,代码应查找"%"并相应地设置格式。

CellEndEdit事件将在网格加载数据后进行更改时工作。不幸的是,当数据"最初"加载到网格中时,CellEndEdit事件不会触发。为了提供帮助,使用了第二个事件RowsAdded,当向网格中添加"新"行时,此事件将激发。在这种情况下,我们可以循环浏览行中的每个单元格,并相应地设置颜色。

示例…

将两个事件连接起来…

public Form1() {
InitializeComponent();
dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(dataGridView1_RowsAdded);
}

由于我们需要"独立"格式化单元格,因此创建一个方法以使给定DataGridViewCell,该方法将检查单元格值并相应地对其进行格式化是有意义的。这种方法在这两种情况下都会派上用场。该方法可能看起来像…

private void FormatACell(DataGridViewCell cell) {
if (cell.Value != null && cell.Value.ToString().Contains("%")) {
cell.Style.BackColor = Color.Red;
}
else {
cell.Style.BackColor = Color.White;
}
}

接下来的两个事件…

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
foreach (DataGridViewCell cell in row.Cells) {
FormatACell(cell);
}
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
FormatACell(cell);
}

最后,为了完成这个例子…

DataTable dt;
private void Form1_Load(object sender, EventArgs e) {
dt = GetDataFromDB();
dataGridView1.DataSource = dt;
}
private DataTable GetDataFromDB() {
DataTable dt = new DataTable();
dt.Columns.Add("Col1", typeof(string));
dt.Columns.Add("Col2", typeof(string));
dt.Columns.Add("Col3", typeof(string));
dt.Rows.Add("Data1", "Dat%a2", "Data3");
dt.Rows.Add("Data2%", "Data3", "Data1");
dt.Rows.Add("Data3", "Data2", "Da%ta1");
return dt;
}

相关内容

  • 没有找到相关文章

最新更新