C#条件格式化动态生成的控件



我试图根据文件中的数据组数量(settlementPeriod(动态创建选项卡,每个选项卡上都有自己的表。

然后,我添加了创建的表,并将它们添加到DataGridViews列表中,以便以后对它们进行操作。

DataGridView dgv = new DataGridView();
tableList.Add(dgv);

foreach (var dgv in tableList)
for (int l = 0; l < dgv.Rows.Count; l++)

但是,该程序为tableRows(dgv.Rows(返回一个null集,并且从不进入循环。它只返回未动态生成的DataGridView的数据。(例如,如果我将dataGridView1添加到表列表中(


我曾尝试遍历选项卡列表(因为每个选项卡只有一个表(,但都没有成功

foreach(var page in tabList)
DataGridView dgv = page.Controls.OfType<DataGridView>() as DataGridView;

我在下面包含了所有相关代码。感谢您的帮助。作为参考,"结果"是一类数据。谢谢//。

private List<DataGridView> tableList = new List<DataGridView>();
private void CreateTables()
{
var listItemsBySettlementPeriod = results.GroupBy(items => items.settlementPeriod)
.Select(group => group.ToList())
.ToList();
for (int i = 0; i < listItemsBySettlementPeriod.Count(); i++)
{
tabControl1.TabPages.Add(listItemsBySettlementPeriod[i][0].settlementPeriod);
tabList.Add(tabControl1.TabPages[(i + 1)]);
DataGridView dgv = new DataGridView();
tableList.Add(dgv);
dgv.Height = 300;    dgv.Width = 1200;
DataTable dt = new System.Data.DataTable();
DataRow row;
string[] header = {"bidType", "date", "unitID", "price", "offerVolume"};
for (int j = 0; j < listItemsBySettlementPeriod[i].Count(); j++)
{
if (j == 0)
for (int k = 0; k < header.Count(); k++)
dt.Columns.Add(header[k], typeof(string));
row = dt.NewRow();
foreach (var value in listItemsBySettlementPeriod[i])
{
row[0] = value.bidType;
row[1] = value.acceptTime;
row[2] = value.unitID;
row[3] = value.price;
row[4] = value.volume;
}
dt.Rows.Add(row);
}
dgv.DataSource = dt;  
tabControl1.TabPages[(i + 1)].Controls.Add(dgv);
}
foreach (var dgv in tableList)
{
for (int l = 0; l < dgv.Rows.Count; l++) //CONDITIONAL FORMATING
{
string val = "";
if (dgv.Rows[l].Cells[0].Value != null)
val = dgv.Rows[l].Cells[0].Value.ToString();
if (val == "OFFER")
dgv.Rows[l].DefaultCellStyle.BackColor = Color.OrangeRed;
else if (val == "BID")
dgv.Rows[l].DefaultCellStyle.BackColor = Color.CornflowerBlue;
else
dgv.Rows[l].DefaultCellStyle.BackColor = Color.LightGray;
}
dgv.Refresh();
}
}

在实际绘制控件(如图所示(之前,不会对其应用数据绑定等。

因此,从方法中删除最后一个foreach循环。

RowPrePaint事件执行条件格式设置。

...
dgv.DataSource = dt;
dgv.RowPrePaint += Dgv_RowPrePaint; // subscribe to event
...

事件处理程序:

private void Dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
var dgv = (DataGridView)sender;
var row = dgv.Rows[e.RowIndex];
var val = row.Cells[0].Value?.ToString();
if (val == "OFFER")
row.DefaultCellStyle.BackColor = Color.OrangeRed;
else if (val == "BID")
row.DefaultCellStyle.BackColor = Color.CornflowerBlue;
else
row.DefaultCellStyle.BackColor = Color.LightGray;
}

此外,不要使用dgv.Refresh()。我经常在代码中看到这个Refresh方法是如何被白白使用的。在这种情况下是没有意义的。

最新更新