Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1895 | Besucher online: 73
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Reihenfolge der neu angeordneten ListView Spalten ermitteln.


Autor: Marcus
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 1724
  
Kick it on dotnet-kicks.de  

Beschreibung:

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


Abgelegt unter: ListView, Column, AllowColumnReorder.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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;
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Christopher Kk schrieb am:  29.03.2011 16:13:48

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 16:58:27

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.


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.