在设计器中显示表单,在加载期间执行代码

时间:2014-03-20 15:25:37

标签: c# winforms windows-forms-designer

我有一个使用Visual Studio 2013在C#中创建的窗体。该窗体包含一个包含2列的ListView。 ListView本身是在由VS自动生成的InitializeComponent()内创建的。我实际上是在InitializeComponent()之外添加列标题。问题是我希望VS中的[Design]视图显示我声明的列标题但我不想混淆InitializeComponent()方法,除了它还说我不应该修改内容方法中的代码。

基本上我所做的是创建一个方法,将两个列标题添加到ListView并格式化它们:

private void initRecipListView()
{
    this.recipList.Columns.Add("Recipient", -2, System.Windows.Forms.HorizontalAlignment.Left);
    this.recipList.Columns.Add("Number of Reports", -2, System.Windows.Forms.HorizontalAlignment.Left);
}

我想调用此方法,以便在运行时期间添加和显示这两列。当我在VS设计器窗口中查看表单时,这是非常好的。我已经尝试将该方法放在构造函数的构造函数中,该构造函数在运行时工作但不在设计器窗口中。

当我在设计器窗口中查看表单时,我需要将这个方法用于调用和使用吗?

1 个答案:

答案 0 :(得分:1)

您可以从ListView派生自己的类并实现这样的方案。您需要的基本要素是预设构造函数中的列数并公开属性以允许您设置列标题文本。重写OnClientSizeChanged()以使列居中并处理出现的垂直滚动条。

添加一个新类并粘贴下面显示的代码。编译。从工具栏顶部删除新控件。您可以在设计器或代码中设置Column1Name和Column2Name属性。您将在设计器中获得WYSIWYG视图。

using System;
using System.ComponentModel;
using System.Windows.Forms;

class MyListView : ListView {
    public MyListView() {
        this.Columns.Add("Unnamed1");
        this.Columns.Add("Unnamed2");
        this.View = View.Details;
    }
    public string Column1Name {
        get { return this.Columns[0].Text; }
        set { this.Columns[0].Text = value; }
    }
    public string Column2Name {
        get { return this.Columns[1].Text; }
        set { this.Columns[1].Text = value; }
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [Browsable(false)]
    public new ListView.ColumnHeaderCollection Columns {
        get { return base.Columns; }
    }
    protected override void OnClientSizeChanged(EventArgs e) {
        base.Columns[0].Width = this.ClientSize.Width / 2;
        base.Columns[1].Width = this.ClientSize.Width - base.Columns[0].Width;
        base.OnClientSizeChanged(e);
    }
}