.NET ListView列顺序问题

ang*_*son 12 .net listview

我在表单中遇到问题,我按以下顺序将列添加到.NET ListView控件:

A   | B   | C   | D
Run Code Online (Sandbox Code Playgroud)

AD列的显示索引按顺序为0-3,但它们显示的顺序错误:

A   | B   | D   | C
            ^-----^  these are switched at runtime
Run Code Online (Sandbox Code Playgroud)

注意:在设计时,一切看起来都像我想要的那样.

我猜,但我不知道为什么,这是因为我在添加了列D之后将列C添加到ListView.我在列编辑器对话框中将其移动了一个档位,调整了显示索引,并检查了创建在.Designer.cs文件中,按顺序排列AD顺序.

然而问题仍然存在.

另请注意:这不仅仅是标题标签问题,还会交换列,包括其数据.数据按我希望显示的顺序添加,但最后两列是交换的.

还有什么我需要检查以弄清楚为什么我的一个列处于错误的位置?

我解决了这个问题.由于某种原因,即使我在对话框中设置了DisplayIndex属性,也不会保留它.

如果我完全关闭了表单,并在Visual Studio中重新打开它,那么它就会转移.显然,对话框编辑器没有将这些属性检测为"已更改",因此保存机制也不关心为我保存它.

添加列的代码如下:

this.lvResult = new System.Windows.Forms.ListView();
this.colResultId = new System.Windows.Forms.ColumnHeader();
this.colResultTitle = new System.Windows.Forms.ColumnHeader();
this.colResultLanguage = new System.Windows.Forms.ColumnHeader();
this.colResultTags = new System.Windows.Forms.ColumnHeader();
// 
// lvResult
// 
this.lvResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
            | System.Windows.Forms.AnchorStyles.Left)
            | System.Windows.Forms.AnchorStyles.Right)));
this.lvResult.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.colResultId,
this.colResultTitle,
this.colResultLanguage,
this.colResultTags});
this.lvResult.FullRowSelect = true;
this.lvResult.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.lvResult.HideSelection = false;
this.lvResult.Location = new System.Drawing.Point(12, 6);
this.lvResult.Name = "lvResult";
this.lvResult.Size = new System.Drawing.Size(466, 117);
this.lvResult.TabIndex = 0;
this.lvResult.UseCompatibleStateImageBehavior = false;
this.lvResult.View = System.Windows.Forms.View.Details;
this.lvResult.SelectedIndexChanged += new System.EventHandler(this.lvResult_SelectedIndexChanged);
// 
// colResultId
// 
this.colResultId.Text = "#";
this.colResultId.Width = 35;
// 
// colResultTitle
// 
this.colResultTitle.Text = "Title";
this.colResultTitle.Width = 220;
// 
// colResultTags
// 
this.colResultTags.DisplayIndex = 2;
this.colResultTags.Text = "Tags";
this.colResultTags.Width = 100;
// 
// colResultLanguage
// 
this.colResultLanguage.Text = "Language";
Run Code Online (Sandbox Code Playgroud)

当我直接在文件中添加缺少的属性时,它工作.

小智 6

我使用Visual Studio 2010时遇到了这个问题.当我查看设计器生成的代码时,它只为部分列设置了DisplayIndex.在设计时,列的顺序正确,但在运行时它们的顺序不同.当我添加我的列时,他们仍然有设计器生成的名称,例如ColumnHeader1等.当我将它们重命名为更有意义的名称并运行我的应用程序时,运行时列顺序是正确的.我查看了设计器生成的代码,发现它重新排序了列创建代码并删除了所有DisplayIndex值(因为它们不需要)


Yoo*_*eek 5

它可能是持久的形式的.resx而不是.designer吗?我无法想象为什么会这样做,但是......

也许如果其他所有方法都失败了,请尝试从表单中删除ListView.然后,在您的项目中创建一个新的垃圾表单,在垃圾表单上重新创建ListView,测试垃圾表单以确保您没有得到奇怪的巫毒行为,然后将ListView从垃圾表单复制回您的真实表单?

非常复杂,我知道......

  • 我正面对这个,但不确定我不确定问题的根源是什么,我要解决的是:1.将列表视图复制并粘贴到同一表格上(只需选择列表视图,ctrl + c然后是ctrl + v); 2.删除旧列表视图(记住名称); 3.使用旧列表视图名称重命名新列表视图; 4.使用属性窗口将旧列表视图事件重新分配给新列表视图.就这样.这可以在不到一分钟的时间内完成. (3认同)
  • 谢谢你,william007。您的解决方案可以简化。1. 复制列表视图 (CTRL+C), 2. 删除列表视图, 3. 粘贴列表视图 (CTRL+V)。现在,列在运行时处于正确的顺序。 (3认同)