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]

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

VB.NET 2017/2015/2013 Einführung

Das Seminar befähigt Sie zur eigenständigen Entwicklung von anwenderorientierten Programmen in VB.NET, worin auch der Einsatz von Datenbanken enthalten ist.

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