可以使用DataGridView在WinForms中完成以下类似于表的UI吗?

时间:2016-06-30 15:22:06

标签: c# winforms visual-studio-2010 datagridview

屁股一直很痛苦,但我一直在使用TableLayoutPanel来显示一些数据,如下面的屏幕截图所示。但有几次有人提出这可以轻松完成 DataGridView

所以我的问题是,可以使用DataGridView在Windows窗体中完成以下屏幕截图吗?我在网上搜索过,没有类似下面的内容。

答案是&#34;是的,它可以。&#34; &#34;不,它是不可能的。&#34; < / strong>即可。但请不要发布替代方案,因为问题的目的是最终知道这样的事情是否可以通过DataGridView完成。

DataTable如下所示:

BG_Color    EmpId     ColNum    RowNum
Yellow      4304      1         1
Yellow      8464      2         1
Yellow      2012      3         1
Blue        4593      1         2
Blue        3515      2         2
Blue        0546      3         2
Green       4346      1         3
Green       5426      2         3
Green       0551      3         3

结果如下。它只显示,无法点击此处:

enter image description here

DataGridView如何实现这一目标?我甚至已经将RowNumColNum包含在每个单元格的确切位置,以防万一。

或者如果有人可以在类似的东西上分享链接,我们将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:2)

是的,您可以使用http

创建此类用户界面
  • 您可以手动设置网格的DataGridViewRowCount
  • 你可以对ColumnCount CellFormatting事件进行处理,然后在那里设置单元格的值和背景颜色。
  • 您不能将数据绑定与当前数据结构一起使用。

以下是您的示例数据的工作示例:

DataGridView

答案 1 :(得分:1)

正如我在问题评论中提到的那样,很容易实现这一点,但只有一个条件:存储在数据表中的数据必须被转动。怎么样?看看例子:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        //create DataTable
        DataTable dt = CreateCustomDataTable();
        var pivotDt = dt.AsEnumerable()
        .GroupBy(x => x.Field<int>("RowNum"))
        .Select(grp => new
        {
            BG_Color = grp.First().Field<string>("BG_Color").ToLower(), //System.Drawing.Color.FromName(grp.First().Field<string>("BG_Color")),
            Emp1 = grp.Where(e => e.Field<int>("ColNum") == 1).Select(a => a.Field<int>("EmpId")).SingleOrDefault(),
            Emp2 = grp.Where(e => e.Field<int>("ColNum") == 2).Select(a => a.Field<int>("EmpId")).SingleOrDefault(),
            Emp3 = grp.Where(e => e.Field<int>("ColNum") == 3).Select(a => a.Field<int>("EmpId")).SingleOrDefault()
        }).ToList();
        dataGridView1.DataSource = pivotDt;
        dataGridView1.Columns[0].Visible = false;

    }

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        DataGridView dgv = (DataGridView)sender;
        e.CellStyle.BackColor = Color.FromName(dgv.Rows[e.RowIndex].Cells[0].Value.ToString());
        e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        e.CellStyle.SelectionBackColor = Color.Transparent;
    }
//...
}

结果:

Result

对于这样的数据量,性能损失的风险等于零。

最终说明 关于您的主要问题:

  

(...)可以使用datagridview在Windows窗体中完成以下屏幕截图吗?

     

答案是肯定的,它可以或不,它是不可能的。 (...)

是。这是可能的 - 非常容易。