c#-在运行时嵌入在UserControl“丢失”列中的ListView

我的环境是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,了解如何执行此操作.

上一篇:c#-Properties.Settings.Default.Save();不保存在用户计算机上


下一篇:使用C#win应用程序打开Web浏览器并在请求中添加请求标头