关于c#:在设计器中显示表单,并在加载期间执行代码

Show form in designer with code executed during load

我有一个使用Visual Studio 2013在C中制作的Windows窗体。该窗体包含一个有2列的ListView。listView本身是在initializecomponent()内部创建的,它是由vs.i自动生成的,实际上是在initializecomponent()外部添加列标题。问题是,我希望vs中的[design]视图显示我声明的列标题,但我不希望使initializecomponent()方法混乱,另外它还表示我不应该修改该方法中代码的内容。

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

1
2
3
4
5
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设计器窗口内查看表单时,添加和显示这两列。我尝试将该方法放入表单本身的构造函数中,该方法在运行时工作,但不在设计器窗口中。

当我在设计器窗口中查看窗体时,是否知道需要将此方法放在何处才能调用和使用?


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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);
    }
}