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
[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!