我的环境是Visual Studio 2012 Express.
我有一个包含ListView的用户控件.
我需要让用户至少设置ListView的外观,因此我公开了Columns属性:
[在usercontrol中]
public ListView.ColumnHeaderCollection Columns {
get { return listView.Columns; }
}
当我将控件放在窗体上时,“属性”面板中将显示“列”属性,并且
我能够添加列等等.
但是,在运行时不会显示列(尽管View属性设置为Details).
我想念什么吗?
更新资料
我认为这可能令人感兴趣,因此我将在下面的Hans Passant上详细说明我的评论:
我创建了一个带有嵌入式ListView的虚拟UserControl,将其Columns和View属性公开.
这样可以从“属性”面板中编辑它们.
使用ColumnHeaders集合编辑器在IDE中编辑嵌入式ListView时,
Form Designer类中的结果代码如下所示:
...
//
// userControl1
//
this.userControl1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2});
this.userControl1.Location = new System.Drawing.Point(12, 12);
this.userControl1.Name = "userControl1";
this.userControl1.Size = new System.Drawing.Size(260, 161);
this.userControl1.TabIndex = 0;
...
由于我将“视图”设置为“详细信息”,因此应该再增加一行:
this.userControl1.View = System.Windows.Forms.View.Details;
如果没有此行,则ListView在运行时将不会显示列标题.
IDE不知何故无法将行放入Form Designer中.如果手动添加了该行,它将按预期工作.
令人费解的是,我在Form_Load事件接收器中添加了一条调试消息
private void Form1_Load(object sender, EventArgs e) {
MessageBox.Show("Columns : " + userControl1.Columns.Count + "\r\nView : " +
userControl1.View.ToString());
}
并在两种情况下都显示View:Details.
解决方法:
您需要应用属性以覆盖默认代码序列化:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ListView.ColumnHeaderCollection Columns {
get { return listView.Columns; }
}
更通用的解决方案是在将UserControl放置在窗体上之后,将整个ListView置于设计模式.这样就可以更改ListView的所有属性,您可能不再需要Columns属性.检查this post,了解如何执行此操作.