.NET ListView列顺序问题
我在表单中遇到了一个问题,我已按以下顺序将列添加到.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。我在“列编辑器”对话框中将其上移了一个
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控件添加列,并使列与其值正确对齐,以便它们不会四处移动,请执行以下步骤:
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);
}