【问题标题】:Is it possible to create a DataGridView which looks like this?是否可以创建一个看起来像这样的 DataGridView?
【发布时间】:2014-01-06 17:31:12
【问题描述】:

这是通过使用一些第三方组件(例如 C1)开发的。如您所见,这里有三种行...

Type 1. L0000000000000000420 - 这种行是从数据库中获取的。 (只读)

Type 2. Enter Amount - 这种行是供用户输入金额的。 (这个也可能在某些列中包含下拉列表)(仅在选中时可编辑)

Type 3. WHITE ROW- 这只是一个空白的只读行,以获得更好的外观和感觉。

我想知道是否可以在不使用任何第三方组件的情况下创建类似的 DataGridView? 我的想法是 .. 将数据库中的行提取到 DataTable 中,然后循环它... 我正在考虑在提取的每一行之后在 DataTable 中添加两个额外的空白行。

我还将添加一个列,该列的值例如 ,

A-(这是表示类型1)

B-(这是表示类型2)

C -(这是表示类型3)

一个

B

C .. 以此类推

然后我将在循环中检查行的类型,然后将该行的属性设置为只读/可编辑,相应的颜色属性。

但我不确定这是否可行。我不确定如何仅为 tpe 2 列添加ComboBox。因为如果我添加一个 ComboBox 列,它将显示在所有三行中。这可能吗?如果是的话,你能给我一些想法吗?在我提出一些更具体的问题之前,我需要知道如何做到这一点。谢谢。

【问题讨论】:

  • 解决方案:使用 WPF。 winforms 是一项非常古老的技术,没有人再关心了,它不支持任何东西。您可以在 WPF 中使用大约 30 到 50 行 XAML 轻松创建类似的东西,而在 winforms 中需要多年的可怕黑客攻击。
  • 恐怕没有足够的时间学习WPF。
  • 您确定在 WinForms 中创建这种外观比学习 WPF 更快吗?
  • 我认为,这是可能的,但它必须是“非绑定数据”,而是手动写入和读取数据。这将需要一些自定义编码。 WPF 并不容易学习。我的意思是,你需要一些经验才能使用 XAML 来发挥你的优势
  • @HighCore:WPF 并不是所有关于 GUI 问题的答案。只需回答问题,而不是大肆宣传 WPF。

标签: c# .net vb.net winforms datagridview


【解决方案1】:

我可能同意 WPF 对于这类事情更好/更快,但是否使用它是他的选择。从头开始学习 WPF 并没有那么快...

只要手动将您的数据绑定到您的DataGridView,您就可以控制单个单元格的行为和外观,当然包括颜色(这是最简单的部分)。我包括一个“消失的组合框”单元格的示例。最后一列是简单的DataGridViewComboBoxColumn。

private void Form1_Load(object sender, EventArgs e)
{

    dataGridView1.Rows.Add(new[] { "L00000422", "", "","A" });
    dataGridView1.Rows.Add(new[] { "Enter Amount", "", "","" });
    dataGridView1.Rows.Add(new[] { "", "", "","" });
    dataGridView1.Rows.Add(new[] { "L00000423", "", "" ,"B"});
    dataGridView1.Rows.Add(new[] { "Enter Amount", "", "", "" });
    dataGridView1.Rows.Add(new[] { "", "", "", "" });

    foreach (var row in dataGridView1.Rows)
    {
        var r = (DataGridViewRow) row;
        foreach (var col in dataGridView1.Columns)
        {
            var cl = (DataGridViewColumn) col;
            if (cl.Index == 3)
            {
                var cc = (DataGridViewComboBoxCell)dataGridView1[3,r.Index];
                if (r.Index % 3 != 0)
                {
                    cc.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
                    cc.ReadOnly = true;
                }
                else
                {
                    cc.DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton;
                    cc.ReadOnly = false;
                }
            }
        }
    }
}

【讨论】:

  • +1:非常高兴指出切换到 WPF 可能不切实际,并且不一定是与 UI 相关的所有问题的答案。希望我也能给一个好的答案加分+1。
  • 为什么不能用这种方式绑定DataGridView?您已为同一行标记了 A、B 和 C。我在想是否可以将 A 添加到从数据库中获取的那些行,B 用于我将在循环中添加的那些行 Enter Amount 用于输入。和 C 为空白分隔符行。我可以将宽度设置为最小。这样它就不会显示,但我可以使用 A、B、C 作为格式化的参考。有可能吗?
  • @Arbaaz 您可以这样做,但如果您尝试将行添加到数据绑定数据网格视图中,您会遇到异常:Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound。不要绑定datagridview,查询您的数据库,获取数据,然后使用循环手动组合您的数据库行和您的自定义行,就像您说的那样。这绝对是可能的。
  • @Vland 是的,这正是我的意思.. 将数据从 DB 获取到 DataSet 中,然后向其中添加行。我正在研究它.. 令人惊讶的是它似乎并不牵强.. 我已经完成了一半。 :)
猜你喜欢
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2018-10-04
  • 2010-11-18
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多