Feedback

C# - Reihenfolge der neu angeordneten ListView Spalten ermitteln.

Veröffentlicht von am 29.03.2011
(0 Bewertungen)
Sobald die Eigenschaft AllowColumnReorder einer ListView auf True gesetzt wurde, ist es unter anderem möglich, in der Detailsicht die Spalten neu anzuordnen.

Will man nun aber auf die neu angeordneten Spalten über den Index zugreifen, werden die Daten der ursprünglichen Anordnung geliefert.

Beispiel:
Spalte 1: Hallo
Spalte 2: Welt

this.lvListView.Items[0].SubItems[0].Text;

Ergebnis: Hallo

Neu angeordnet (durch Benutzer):
Spalte 1: Welt
Spalte 2: Hallo

this.lvListView.Items[0].SubItems[0].Text;

Ergebnis: Hallo

Das Snippet dient zum ermitteln der tatsächlich angeordneten Indizes.

Somit wird durch folgenden Code die richtige Spalte ausgegeben:

int[] currentColumnOrder = this.lvListView.GetColumnOrder();
this.lvListView.Items[0].SubItems[currentColumnOrder[0]].Text;

Ergebnis: Welt
Ergebnis von currentColumnOrder[0]: 1
GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(
    IntPtr hWnd, int msg, int wParam, int[] lParam);
private const int LVM_FIRST = 0x1000;
private const int LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59);

/// <summary>
/// Gibt die aktuelle Reihenfolge der ListViewSpalten zurück.
/// </summary>
/// <param name="lv">ListView</param>
/// <returns>Indexe der sortierten Spalten.</returns>
public static int[] GetColumnOrder(this ListView lv)
{
    int count = lv.Columns.Count;
    int[] order = new int[count];

    if (SendMessage(lv.Handle, LVM_GETCOLUMNORDERARRAY, count, order) == 0)
    {
        throw new ApplicationException(
            "Spalten-Reihenfolge konnte nicht ermittelt werden.");
    }

    return order;
}
Abgelegt unter ListView, Column, AllowColumnReorder.

2 Kommentare zum Snippet

Christopher Kk schrieb am 29.03.2011:
Denn Sinn der If-Abfrage versteh ich überhaupt nicht? Ist es wirklich nötig da nen Win-API Call zu machen? Wenn ja, warum, erklär mir das mal bitte, ich versuchs grad zu verstehen.
Marcus schrieb am 29.03.2011:
Hi,

sobald in SendMessage ein Fehler auftritt, wird der Wert 0 und ansonsten der Wert 1 zurück geben. Es kann beispielsweise ein Fehler durch die Übergabe falscher Parameter hervorgerufen werden. Dies ist aber bei dieser Konstellation eher selten der Fall. Somit bleibt es ansichtssache, ob hier ein if erstellt wird oder nicht.

Ja, der Aufruf ist nötig - zumindest ist mir kein anderer Weg bekannt - da die Spalten von dem Benutzer neu angeordnet werden können (Drag & Drop) und nicht vom Programm.
 

Logge dich ein, um hier zu kommentieren!