【问题标题】:How to prevent designer column replication when using extended DataGridView control that adds columns?使用添加列的扩展 DataGridView 控件时如何防止设计器列复制?
【发布时间】:2017-09-05 07:20:40
【问题描述】:

我正在创建一个 DataGridView 继承控件,该控件执行一些样式化并添加许多列。问题是,当将此控件添加到另一个表单时,设计人员会看到 Columns 属性与其默认值不匹配,因此将列生成添加到新表单中的设计人员。

为了说明问题。采取以下控制:

class CustomDataGridView : DataGridView
{
    public CustomDataGridView()
    {
        Columns.Clear();
        Columns.Add("Column", "Header");
    }
}

Columns.Clear() 是不必要的 - 它只是为了说明问题不在于构造函数。无论如何,将控件添加到表单中。导致表单 UI 重新加载(例如通过调整 datagridview 的大小),并且设计器最终会不断添加新列。我尝试了各种想法,但没有结果。我试图对设计器隐藏 columns 属性,但不幸的是它不是虚拟的,这也是不行的。

有什么想法吗?我觉得我必须遗漏一些简单的东西,因为这可能是一种相当常见的使用模式。我可以在运行时添加列,但理想情况下我希望它们在设计器中保持可见/可编辑。

【问题讨论】:

  • 首先,每次加载表单 UI 时(设计时),都会在加载 UI 上添加该列。其次,不应在控件构造函数中添加列,但如果需要,请将其放在条件块中,例如if (!DesignMode) {这里的代码}
  • 我也试过了!DesignMode。它(似乎)应该工作,但没有。
  • 如果可能,分享代码。社区很容易重现和建议解决方法/解决方案,而不是继续猜测可能出了什么问题。
  • 问题不明确吗?我试图将其分解为最基本的情况。我想在扩展的 datagridview 控件中添加一组预定义的列。据我所知,您的解决方案是 - 在上面的代码中 - 将 Columns.Add(..) 更改为 if(!DesignMode) Columns.Add(...)。那是行不通的。

标签: c# winforms datagridview


【解决方案1】:

我在问题中提到的想法实际上似乎只使用非真正隐藏的属性隐藏就可以正常工作:

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public new DataGridViewColumnCollection Columns { get => base.Columns; }

这解决了希望能够查看设计器中的列并与之交互的所有问题,并且由于此控件中的列不打算修改它是可以接受的 - 但是有没有一种方法可以在没有像这样破解?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2012-01-07
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多