.NET ListView列顺序问题

.NET ListView列顺序问题,.net,listview,.net,Listview,我在表单中遇到了一个问题,我已按以下顺序将列添加到.NET ListView控件中: A | B | C | D 列A-D的显示索引为0-3,按该顺序排列,但它们的显示顺序错误: A | B | D | C ^-----^ these are switched at runtime 注意:在设计时,一切看起来都是我想要的 我猜,但我不知道为什么,这是因为我在添加了列D之后,在ListView中添加了列C。我在“列编辑器”对话框中将其上移了一个

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

A   | B   | C   | D
列A-D的显示索引为0-3,按该顺序排列,但它们的显示顺序错误:

A   | B   | D   | C
            ^-----^  these are switched at runtime
注意:在设计时,一切看起来都是我想要的

我猜,但我不知道为什么,这是因为我在添加了列D之后,在ListView中添加了列C。我在“列编辑器”对话框中将其上移了一个级别,调整了显示索引,并检查了.Designer.cs文件中的创建顺序,一切都是按a-D顺序进行的

但问题依然存在

还要注意:这不仅仅是标题标签的问题,列之间是交换的,包括它们的数据。数据是按照我期望的显示顺序添加的,但最后两列是交换的

我还需要检查什么才能找出我的一列位置错误的原因

我解决了这个问题。出于某种原因,即使我在对话框中设置了DisplayIndex属性,它也不会持久化

如果我完全关闭了表单,并在VisualStudio中重新打开了它,那么它就会四处移动。显然,对话框编辑器没有将这些属性检测为“已更改”,因此保存机制也不想为我保存它

添加列的代码如下所示:

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";

当我直接在文件中添加缺少的属性时,它起了作用。

是否可能将某些内容持久化到表单的.resx而不是.designer?我无法想象它为什么会那样做,但是是的

如果所有其他操作都失败,请尝试从表单中删除ListView。然后,在项目中创建一个新的垃圾表单,在垃圾表单上重新创建ListView,测试垃圾表单以确保没有出现奇怪的巫毒行为,然后将ListView从垃圾表单复制回真实表单


非常复杂,我知道…

有一种方法可以做到这一点,移动为ListView生成的设计时代码,以及它的列,然后将它们放入一个方法中…参见这里的示例

public Mainform(){ InitializeComponent(); // InitListView(); } public void InitListView(){ // Design time generated code and manually add it here. } 公共表格({ 初始化组件(); // InitListView(); } public void InitListView(){ //设计时生成代码并手动添加到此处。 } 这是处理奇怪的设计时问题的糟糕方法…唯一的障碍是,如果你想添加另一个专栏,你将无法在设计时看到它

希望这有帮助, 顺致敬意,
Tom。

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

我知道如何解决这个问题,你需要重建项目,它会再次变得很好。

除了移动成员之外,你还需要重置DisplayIndex。
将C列的DisplayIndex设置为3,将D列的DisplayIndex设置为4,编辑设计器并手动为每列写入DisplayIndex属性。
建造良好,运行良好。虽然现在我看到设计器有一点变化,但对我来说它工作得很好。

我偶尔会遇到这个问题,但只有在我对项目进行多次更改并在ListView中先插入列时才会出现

我发现三种不同的修复方法都有效,但没有一种能一直有效。然而,以下几点对我来说一直很有效:

在中间移动任何列,然后向下移动。
  • 重新生成项目生成>>重新生成
  • 关闭然后重新打开项目

  • 我发现(1)和(2)每次都不起作用,不做(3)会导致在下一次打开时返回时出现故障。

    我在Visual Studio 2017中遇到了相同的问题。在设计时,它们的顺序是正确的。但在运行时,最后两列被切换


    对我来说,最终解决这个问题的方法是转到列表视图任务(列表视图右上角显示的小按钮)并将视图更改为大图标。运行项目。退出。返回并将视图更改为“详细信息”,然后运行它。这为我解决了这个问题。

    要在Visual Studio 2015中向ListView控件添加列,并使列与其值正确对齐,以便它们不会四处移动,请执行以下步骤:

  • 转到Visual Studio中的窗体
  • 单击ListView控件右上角的智能标记。(小箭头)
  • 单击“编辑列”
  • 此时将打开ColumnHeader集合编辑器对话框
  • 单击添加按钮
  • columnHeader1将在“成员”框中显示,旁边有一个数字
  • 现在查看属性框,成员框旁边的框,并在行为下查找DisplayIndex。如果未显示DisplayIndex,请单击行为旁边的箭头以显示它
  • DisplayIndex中的数字将与columnHeader1的数字匹配
  • 请注意“成员”框和“属性”框之间的两个粗体黑色大箭头。一个用于向上移动,另一个用于向下移动
  • 如果要将columnHeader1(新列)移动到其他位置,请选择它,然后单击粗体大黑色向上箭头或粗体大黑色向下箭头,将其定位到希望它显示在ListView控件中的位置
  • 向上或向下移动columnHeader1时,其旁边的数字将更改,但DisplayIndex中的数字将保持不变。不好的!columnHeader1编号必须与DisplayIndex编号匹配
  • 更改DisplayIndex编号,使其与columnHeader1的编号匹配。如果旁边的号码是
        mImageList.Images.Add(_IconImage);
        ListViewItem Item = new ListViewItem("", mImageList.Images.Count - 1);
        Item.SubItems.Add(_ImageBase64);
        Item.SubItems.Add(_Description);
        Item.SubItems.Add(_Name);
        lvIconList.Items.Add(Item);
    
        Func<int, int> U = int idx => lvIconList.Columns.OfType<ColumnHeader>
                .Where(a => a.DisplayIndex == idx).Select(a => a.Index).Sum();
    
        for (int i = 0; i <= lvIconList.Columns.Count - 1; i++) {
            Console.WriteLine(lvIconList.Columns(UU(i)).Text);
        }