Dot-Net

.NET ListView 列順序問題

  • March 19, 2021

我在表單中遇到問題,我已按以下順序將列添加到 .NET ListView 控制項:

A   | B   | C   | D

AD 列的顯示索引為 0-3,按該順序排列,但它們的顯示順序錯誤:

A   | B   | D   | C
           ^-----^  these are switched at runtime

注意:在設計時,一切看起來都是我想要的。

我想,但我不知道為什麼,這是因為我在添加 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";

當我直接在文件中添加缺少的屬性時,它起作用了。

它是否可能在表單的 .resx 而不是 .designer 上保留一些東西?我無法想像它為什麼會那樣做,但是…

也許如果所有其他方法都失敗了,請嘗試從表單中刪除 ListView。然後,在您的項目中創建一個新的垃圾表單,在垃圾表單上重新創建 ListView,測試垃圾表單以確保您沒有得到奇怪的巫毒行為,然後將垃圾表單中的 ListView 複製回您的真實表單?

很糾結,我知道…

我在使用 Visual Studio 2010 時遇到了這個問題。當我查看設計器生成的程式碼時,它只為某些列設置了 DisplayIndex。在設計時,這些列的順序正確,但在執行時它們的順序不同。當我添加我的列時,它們仍然具有設計器生成的名稱,例如 ColumnHeader1 等。當我將它們重命名為更有意義的名稱並執行我的應用程序時,執行時列排序是正確的。我查看了設計器生成的程式碼,發現它重新排序了列創建程式碼並刪除了所有 DisplayIndex 值(因為它們不需要)

引用自:https://stackoverflow.com/questions/2225001