2016-06-24 2 views
0

Если список (в режиме подробной информации) прокручивается вниз, а затем вы изменяете размер списка, а если вы изменяете размер столбцов в событии «Изменение размера» или даже в событии макета, содержимое сильно искажается.Как работать с проблемой Windows ListView?

Чтобы воспроизвести, сделать новый C# проект и поместить этот код там:

private void Form1_Load(object sender, EventArgs e) 
    { 
     ListView lv = new ListView(); 
     lv.Size = ClientSize; 
     lv.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top; 
     lv.Columns.Add(new ColumnHeader()); 
     lv.Columns.Add(new ColumnHeader()); 
     lv.View = View.Details; 
     lv.FullRowSelect = true; 
     lv.Resize += lv_Resize; 
     Controls.Add(lv); 

     string[] s = new string[2]; 
     s[0] = "hrd"; 
     s[1] = "igwegmg";   
     for (int i = 0; i < 20; i++) 
     { 
      lv.Items.Add(new ListViewItem(s)); 
     } 

     lv_Resize(lv, null); 
    } 

    private void lv_Resize(object sender, EventArgs e) 
    { 
     ListView lv = (ListView)sender; 
     lv.Columns[1].Width = lv.ClientSize.Width - lv.Columns[0].Width; 
    } 

Выполнить это, прокрутите список вниз немного, изменить размер формы, чтобы показать все элементы путем перетаскивания в нижней части формы вниз.

Измените его размер до тех пор, пока не появится полоса прокрутки, и это ухудшится. Или вместо изменения размера просто увеличивайте и восстанавливайте форму.

Обратите внимание, что есть пучок (в зависимости от того, сколько вы прокрутили) пустых элементов в верхней части списка, вы не можете на них нажимать. Чтобы восстановить его в обычном режиме, вам нужно сделать одну из двух вещей.

  1. Восстановить предметы (не очень хорошо - у меня слишком много предметов, и я теряю положение прокрутки).

  2. вручную, если вы измените размер формы, где появится полоса прокрутки, затем прокрутите полосу прокрутки до нижней части, затем переместите мышь с полосы прокрутки, а затем назад на верхнюю часть полосы прокрутки вы увидите полосу прокрутки измените размер, в этот момент вы можете перетащить полосу прокрутки вверх, а затем вернуться к нормальной.

Если вас RedrawItems, то, по крайней мере, вы можете увидеть все детали снова, но вы все равно получите пустые пункты в верхней части. Выполнение функции begininvoke функции, вызывающей RedrawItems после того, как событие resize/layout не всегда работает.

Любые идеи по этой ошибке? Я действительно не хочу использовать какие-либо другие средства управления или программное обеспечение сторонних разработчиков.

+0

Вы говорите, что «содержание испорчены плохо». Определить. Плохие данные, визуальные артефакты? – DonBoitnott

+0

визуальные артефакты. текст исчезает, а на полпути снова появляется и пустые строки над реальными строками. – Dorf

+0

Вы сами рисуете эти предметы? Это звучит как простая проблема с обновлением. – DonBoitnott

ответ

0

Заметка: другой ListView в моем приложении не показывает ошибку. Обнаружили его, потому что они изменяли размеры столбцов внутри события Resize формы.

Обход проблемы: Dont Изменение размеров столбцов в ListView.Resize(), но это делается в событии Form.Resize().

Я оставлю это открыть littelwhile закончат некоторые из вас уже исследуют для обходного использовать ListView.Resize()

Смежные вопросы