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: HalloNeu angeordnet (durch Benutzer):Spalte 1: Welt
Spalte 2: Hallo
this.lvListView.Items[0].SubItems[0].Text;
Ergebnis: HalloDas 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: WeltErgebnis 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;
}
2 Kommentare zum Snippet