如何在设计时显示DataGridView的行和项目

6
我希望在设计模式/设计时显示DataGridView行。有没有办法实现这个功能?
我尝试在控件的构造函数中使用此函数:datagridview1.Rows.Add(); ,但是这些行和它们的项只能在运行时显示。
我需要在设计时显示行和它们的项,因为我正在自定义 datagridview 控件 的外观。所以每次我进行更改,比如更改 AlternatingRowColor、RowFont 等,我都必须运行控件才能看到更改。
这会浪费时间。
如果我能在设计时/设计模式下显示所有行,那么当我进行更改时就可以立即看到更改,这将节省很多时间。
我正在Windows Forms 中自定义Datagridview Control,使用的是C#语言。
我并没有在代码中定义控件,而是从控件选项卡中拖放控件到一个Winform中。
谢谢。

请查看以下链接:https://stackoverflow.com/questions/18627873/sql-server-datagridview-display-column-value-from-table - Synapsis
3个回答

4
我会为 DataGridView 的上下文菜单添加一个设计器操作,并根据需要分配它的行为。例如(以虚拟数据作为预览的起点):
using System;
using System.ComponentModel.Design;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.Design;
public class MyDataGridView : DataGridView
{
    private IDesignerHost designerHost;
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        if (DesignMode && Site != null)
        {
            designerHost = Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
            var designer = (ControlDesigner)designerHost?.GetDesigner(this);
            designer?.Verbs?.Add(new DesignerVerb("Preview with dummy data", (o, a) =>
            {
                //Some logic to add dummy rows, just for example
                this.Rows.Clear();
                if (Columns.Count > 0)
                {
                    var values = Columns.Cast<DataGridViewColumn>()
                        .Select(x => GetDummyData(x)).ToArray();
                    for (int i = 0; i < 2; i++)
                        Rows.Add(values);
                }
            }));
            designer?.Verbs?.Add(new DesignerVerb("Clear data", (o, a) =>
            {
                this.Rows.Clear();
            }));
        }
    }
    private object GetDummyData(DataGridViewColumn column)
    {
        //You can put some logic to generate dummy data based on column type, etc.
        return "Sample";
    }
}

因此,您将看到两个菜单项添加到上下文菜单中,通过单击“使用虚拟数据预览”,您将在设计时看到控件中添加了两行虚拟数据:

enter image description here


Aghael:我会尝试你提出的解决方案。当我阅读你的代码时,它很有道理。 - Russell Chidhakwa
没问题,这个截图是在设计时从同一个 MyDataGridView 类中取的。顺便说一下,你可以叫我 Reza。其实 Aghaei 是我的姓 ;) - Reza Aghaei
我已经尝试了您的解决方案,它正好解决了我的问题。我非常感激。现在我可以自定义DataGridView而无需每次运行它。 - Russell Chidhakwa
太棒了!太好了!这已经足够开始了。你可以稍后增强生成虚拟数据的逻辑。 - Reza Aghaei
1
这个解决方案将帮助许多希望在设计模式下自定义DataGridView控件的人。太棒了! - Russell Chidhakwa

1
我认为在WinForms DataGridView中不可能实现,只能在WPF中实现。也许你可以通过某种方式进行扩展,但这可能并不容易且不值得。

https://social.msdn.microsoft.com/Forums/windows/en-US/bc6c84c1-0a3a-4c97-8966-30be371576d9/how-to-add-some-row-to-datagridview-control-at-design-time?forum=winforms

在设计时添加DataGridView的行不受支持。根据我的理解,这是因为我们通常将数据源绑定到DataGridView以生成行,而不是直接添加它们。

0

正如Alex P.的回答所指出的那样,这是不可能的。有了一点经验,你就能预测它的外观。

如果您有很多视觉设计(即由于客户的详细要求),您还可以设计一个小的测试应用程序,在其中可以拥有颜色列表和字体选择器,并将所选属性应用于DataGridView属性,例如DefaultCellStyle.BackColor.ForeColorFont等等。在运行时使用按钮或.SelectionChanged事件来设置每个属性。您可能可以在CodeProjectGithubthis is related)上找到一些已完成的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接