2013-12-19 7 views
5

Ich möchte einen anständigen AutoResize Mechanismus zu meinem Listview hinzufügen, aber ich weiß nicht, was ich tun soll.Implementieren Sie einen schönen Autoresize-Mechanismus für ListView-Spalten?

habe ich die letzte Spalte itselfs AUTORESIZE, wenn das Formular die Größe:

enter image description here:

Private Sub Form1_Resize(sender As Object, e As EventArgs) _ 
Handles MyBase.Resize 

    ColumnDownload.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize) 

End Sub 

Aber diese nativen Autoresize Methode ist so falsch, denn wenn ich die Anwendung Größe ändern, wird die horizontale Bildlaufleiste angezeigt

enter image description here

Ofcourse Wenn ich von mir selbst mit der Maus auswählen th Das letzte Spaltentrennzeichen, um die Spaltenbreite zu erhöhen, dann möchte ich die horizontale Bildlaufleiste sehen/verwenden, aber das Autoresize-Framework erhöht automatisch die Größe, die diese horizontale Bildlaufleiste anzeigt, ist so hässlich und unscharf, dass die Bildlaufleiste bei der Größenänderung nicht automatisch angezeigt werden muss !

Das Aussehen, die ich möchte nur JDownloader und all die netten Programme hat, ein Autoresize, die genau auf den Beginn der vertikalen Scrollbalken stoppt, ohne den hässlichen horizontalen Scrollbar zeigt, wenn nicht beispielsweise wie dies erforderlich ist,:

enter image description here

Ich hoffe, dass Sie meine Frage verstehen konnten.

EDIT:

'magische Lösungen' wie diese:

MyColumnHeader.Width = -2 
MyColumnHeader.Width = -1 

... Hat das gleiche. Siehe guten Artikel hier:

Wirklich alle Google-Suchergebnisse über Größenanpassung einer Listview in .NET verwenden, dass jede proportionale Größe oder Alternative, jede anständige automatische Resizer, unglaublich.

+0

Code schreiben, um die Größe jeder Spalte proportional zur neuen Breite des Steuerelements zu ändern ** weniger ** die Breite des vertikalen Bildlaufs. OnSizeChanged vielleicht, setzen Sie jede Spaltenbreite zurück und rufen Sie dann Invalidate auf. benötige wahrscheinlich auch eine 'rectOldSize', um den proportionalen Teil ausführen zu können. – Plutonix

+0

Wie werden diese angepasst, wenn Sie die Größe der App ändern? Verwenden Sie ein TableLayoutPanel oder einen Code-Code? Ich habe eine Prozedur für, wenn VScrolls erscheinen, aber ich bin nicht sicher, ob das das ist, was Sie suchen (oder wenn es mit einem TLP oder was ein TLP Colum breiten funktioniert). – Plutonix

+0

'Wie werden diese angepasst, wenn Sie die Größe der App ändern?' Ich habe die (seltsame) Methode zur Größenanpassung der letzten Spalte beschrieben, außerdem habe ich den Aspekt der 'LV' gezeigt, wenn ich die Größe der App im Bilder oben, alle notwendigen Informationen sind in der Frage, es gibt keinen Code mehr darüber. Ich verwende kein 'TLP', verwende die 'Anchor'-Eigenschaft, um die' LV' zu ändern, wenn die Größe des Formulars geändert wird. Ich denke, eine Funktion zu wissen, wenn ein 'VSCroll' erscheint kann mir für nichts helfen, eine perfekte Lösung (Träumen ist kostenlos) könnte der Code sein, der' ObjectListView' verwendet, um die proportionale Größe für die generische Verwendung zu übersetzen. – ElektroStudios

Antwort

4

ObjectListView, ein Open-Source-Wrapper um einen .NET-Listview, hat eine FillsFreeSpace Eigenschaft, die genau dies tut.

Wenn der Benutzer die Größe des Steuerelements ändert, wird die Spalte größer oder kleiner, sodass die horizontale Bildlaufleiste nie angezeigt wird. Es war relativ kompliziert, richtig zu implementieren :)

Siehe this link für weitere Details.

[Bearbeiten]

Grundschema:

  1. Hören für Resize Ereignis auf dem Listview.
  2. Berechnen Sie die Breite aller Spalten mit Ausnahme der letzten
  3. die Differenz der Breite der anderen Spalten und die ClientSize des Listview die letzte Spalte Größe ändern.

wird diese Arbeit:

private void ResizeLastColumn(int listViewWidth) 
{ 
    int totalColumnWidth = 0; 
    for (int i =0 ; i < listView1.Columns.Count - 1; i++) { 
     totalColumnWidth += listView1.Columns[i].Width; 
    } 

    colLast.Width = Math.Max(listViewWidth - totalColumnWidth, 10); 
} 

private void listView1_Resize(object sender, EventArgs e) 
{ 
    ResizeLastColumn(this.listView1.ClientSize.Width); 
} 

Die Begrenzung ist, dass die horizontale Bildlaufleiste leicht flackern, wenn die Steuer schrumpft. Um , zu erhalten, müssen Sie die WM_WINDOWPOSCHANGING Nachricht abfangen und die Spalten auf die Größe ändern, die das Steuerelement gehen wird. Dies ist etwas kompliziert - und genau das, was ObjectListView macht :)

+0

Ich schätze die Informationen, aber Entschuldigung ist kein praktikabler Ansatz für mich, Verwenden von ObjectListView bedeutet, eine 1000-Linien-Modell-Klasse zu schreiben Nur 1 String-Element zu einem ListView hinzufügen und alle meine geschriebenen Listview Dinge zu ersetzen, um sie in die ObjectListview zu übersetzen. Auch benutze ich ein benutzerdefiniertes ListView-Benutzersteuerelement, das von mir entworfen wurde, nur kann ich das nicht verwenden, hat irgendeines für jedes Projekt einfach. Durch den Weg in der Quelle habe ich versucht, die FillsFreeSpace-Methoden zu verstehen und zu finden reproduzieren/kopieren Sie sie, aber der C# -Code ist zu komplex C# und ich bin ein VBNET-Programmierer Ich kenne nur die Grundlagen von C#. Danke noch einmal – ElektroStudios

Verwandte Themen