c# - 运行时嵌入 UserControl 'loses' 列的 ListView

标签 c# winforms

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

[在用户控件中]

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

当我将控件放在窗体上时,“列”属性会显示在“属性”面板中,并且
我可以添加列等等。
然而,在运行时不会显示列(尽管 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;  
...  

由于我将View设置为Details,所以应该多了一行:

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

并且在这两种情况下都显示View : Details

最佳答案

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

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

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

关于c# - 运行时嵌入 UserControl 'loses' 列的 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27668276/

相关文章:

c# - 使用 Action<> 委托(delegate)时 int 递增的奇怪行为

c# - 更新局部区域 MVC3

c# - TextBox.TextChanged 和 "CTRL-a"

c# - 在拆分器移动时刷新 SplitContainer 的面板

c# - 透视 3D 对象

c# - 数据库中的跟踪错误

c# - 如何使用 Xpath 在文本匹配期间忽略双空格

c# - 为什么在尝试调用我的方法时会出现对象引用错误?

c# - 用于查看对象详细信息的 winforms 控件

c# - 使用 C# winforms 自定义复制/粘贴行为,同时允许文本编辑复制/粘贴