Подтвердить что ты не робот

Проблема порядка столбцов .NET ListView

У меня проблема в форме, где я добавил столбцы в элемент управления .NET ListView в следующем порядке:

A   | B   | C   | D

Индекс отображения для столбцов A-D равен 0-3, в этом порядке, но они отображаются в неправильном порядке:

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

Примечание. Все выглядит так, как я хочу, во время разработки.

Я думаю, но я не знаю, почему, потому что я добавил столбец C в ListView после того, как добавил столбец D. Я переместил его в диалоговом окне редактора столбцов, скорректировал индексы отображения и проверил порядок создания в файле .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";

Когда я добавил отсутствующие свойства непосредственно в файл, он работал.

4b9b3361

Ответ 1

Возможно, что-то сохраняется в форме .resx вместо .designer? Я не могу представить, почему это так, но да...

Возможно, если все остальное не удастся, попробуйте удалить ListView из вашей формы. Затем создайте новую нежелательную форму в своем проекте, воссоздавая ListView в мусорной форме, протестируйте мусорную форму, чтобы убедиться, что вы не получаете странное поведение вуду, а затем скопируйте ListView из мусорной формы обратно в свою реальную форму?

Ужасно запутанный, я знаю...

Ответ 2

У меня была эта проблема с использованием Visual Studio 2010. Когда я посмотрел на код, созданный конструктором, он установил DisplayIndex только для некоторых столбцов. Во время разработки столбцы находились в правильном порядке, но во время выполнения они находились в другом порядке. Когда я добавил свои столбцы, у них все еще были имена, созданные разработчиком, например. ColumnHeader1 и т.д. Когда я переименовал их в более значимые имена и запустил мое приложение, упорядочение столбцов времени выполнения было правильным. Я посмотрел на код, созданный конструктором, и увидел, что он изменил порядок создания столбца и удалил все значения DisplayIndex (поскольку они не нужны)

Ответ 3

Есть способ сделать это, переместить код времени разработки, сгенерированный для ListView, и его столбцы, а затем вставить их в метод... см. здесь пример

public Mainform(){
    InitializeComponent();
    //
    InitListView();
}

public void InitListView(){
    // Design time generated code and manually add it here.
}

Это дерьмовый способ справиться со странными проблемами времени дизайна.... единственная загвоздка - если вы хотите добавить еще один столбец, вы не увидите его во время разработки...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Ответ 4

Больше, чем перемещение членов, вам нужно reset DisplayIndex. Установите DisplayIndex для столбца C равным 3 и DisplayIndex для D до 4

Ответ 5

Я редактирую конструктор и пишу вручную для каждого столбца свойство DisplayIndex. Строит отлично, отлично работает. Хотя теперь я вижу, что дизайнер немного изменился, но для меня это работает нормально.

Ответ 6

Я столкнулся с той же проблемой в Visual Studio 2017. Во время разработки они были в правильном порядке. Но во время выполнения были переключены последние 2 столбца.

Что, наконец, исправило это для меня, я перешел к представлению списка "Задачи" (маленькая кнопка, которая отображается в верхнем правом углу списка) и измените представление на "Большие значки". Запустите проект. Выйдите. Вернитесь назад и измените представление на "Детали" и запустите его. Это исправило это для меня.

Ответ 7

Я знаю, как это исправить, вам нужно перестроить проект, он снова станет приятным.

Ответ 8

У меня есть эта проблема время от времени, но только тогда, когда я делаю много изменений в проекте и вставляю столбцы перед другими в ListView.

Я нахожу три отдельных исправления, но никто не работает все время. Однако для меня всегда работало следующее:

  • Переместите любой столбец посередине вверх и вниз.
  • Перестроить проект Build → Rebuild
  • Закройте, затем заново откройте проект

Я нахожу, что ни одно (1), ни (2) не работает каждый раз, и что не выполнение (3) может привести к тому, что условие вне порядка возвращается при следующем открытии.