【问题标题】:C# Conditonal Formatting dynamically generated controlsC# 条件格式动态生成的控件
【发布时间】:2018-07-31 21:24:15
【问题描述】:

我尝试根据文件 (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) 返回一个空集,并且永远不会进入循环。它只返回不是动态生成的 DataGridView 的数据。 (例如,如果我将 dataGridView1 添加到 tableList)


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

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();
        }
}

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

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

    所以从你的方法中删除最后一个 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 方法是如何被无用使用的。在这种情况下是没有意义的。

    【讨论】:

    • 谢谢。该修复程序非常有效!你是一个救生员:D
    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 2014-02-13
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多