嵌入在用户控件中的列表视图在运行时“丢失”列

本文关键字:运行时 丢失 视图 用户 控件 列表 | 更新日期: 2023-09-27 18:35:21

我的环境是Visual Studio 2012 Express。
我有一个包含列表视图的用户控件。
我需要让用户至少设置 ListView 外观,所以我公开了 Columns 属性:

[ 在用户控件中 ]

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

当我将控件放在窗体上时,"列"属性将显示在"属性"面板中,并且
我可以添加列等。
但是,在运行时不会显示列(尽管"视图"属性设置为"详细信息")。
我错过了什么吗?

更新

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

我创建了一个带有嵌入式 ListView 的虚拟用户控件,将其列和视图属性公开为公共属性。
这允许从"属性"面板编辑它们。
使用 ColumnHeaders 集合编辑器在 IDE 中编辑嵌入的列表视图时,
窗体设计器类中生成的代码如下所示:

...  
//  
// 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());      
}  

它显示 查看 :两种情况下的详细信息

嵌入在用户控件中的列表视图在运行时“丢失”列

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

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

更通用的解决方案是在将用户控件放在窗体上后将整个 ListView 置于设计模式。 这使您可以更改 ListView 的所有属性,您可能不再需要 Columns 属性。 查看这篇文章,了解如何做到这一点。

我遇到了同样的问题 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 的面板和一个带有Dockstyle.Bottom的FlowLayoutPanel,其中包含与用户交互的控件对象。

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

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

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