嵌入在UserControl中的ListView失去了'运行时的列

时间:2014-12-27 14:39:51

标签: c# winforms

我的环境是Visual Studio 2012 Express 我有一个包含ListView的usercontrol 我需要让用户至少设置ListView外观,所以我暴露了Columns属性:

[在usercontrol中]

public ListView.ColumnHeaderCollection  Columns {  
    get { return listView.Columns; }  
}  

当我将控件放在窗体上时,Columns属性显示在Properties面板中 我可以添加列等。
但是,在运行时,不显示列(尽管View属性设置为Details) 我错过了什么吗?

更新

我认为这可能会引起一些兴趣,所以我将在下面的Hans Passant详细阐述我的评论:

我创建了一个带有嵌入式ListView的虚拟UserControl,将其Columns和View属性公开为public 这允许从“属性”面板编辑它们 使用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_Load 事件接收器中添加了调试消息

private void Form1_Load(object sender, EventArgs e) {  
    MessageBox.Show("Columns : " + userControl1.Columns.Count + "\r\nView : " + 
    userControl1.View.ToString());      
}  

并在两种情况下显示查看:详细信息

2 个答案:

答案 0 :(得分:3)

您需要应用属性来覆盖默认代码序列化:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public ListView.ColumnHeaderCollection  Columns {  
    get { return listView.Columns; }  
} 

更通用的解决方案是在表单上删除UserControl后将整个ListView置于设计模式。这使您可以更改所有 ListView的属性,您可能不再需要您的Columns属性。检查this post以了解如何执行此操作。

答案 1 :(得分:0)

我对VB.NET有同样的问题

我在设计器中添加了列,并将ListView.View添加到详细信息中,但在运行时,即使它们在设计器中可见,我的列也会消失。

因此,我删除了设计器中的所有列,并使用代码创建了它们。

Private Sub InitListView()
    Dim listView As New ListView
    listView.Columns.Add("Test", 100, HorizontalAlignment.Left)
    listView.Dock = DockStyle.Fill
    listView.View = View.Details

    Me.panelListView.Controls.Add(listView)
End Sub

但我还有一个带Dockstyle.Top的Panel和一个带有Dockstyle.Bottom的FlowLayoutPanel,它包含与用户交互的控件对象。

使用DockStyle.Fill将ListView添加到我的UserControl.Controls在设计器中工作但是我的列在运行时再次消失。

解决方案是在设计器中创建一个Panel并将其设置为Dockstyle.Fill。

正如您在我的代码片段中看到的,我可以将ListView设置为Dockstyle.Fill并将其添加到面板中。这工作正常,我的专栏现在可见。