Darstellung von Sonderzeichen in ListView Column
-
Hallo zusammen,
ich habe ein kleines Problem mit dem ListView. Ich nutze vom LV nur die Detailansicht und habe mir einen eigenen Spaltensortierer implementiert. Nun wollte ich erreichen, das man erkennen kann, nach welcher Spalte man die Liste sortiert hat.
Ich habe das bisher über Images erledigt und dynamisch die entsprechenden Pfeile hoch/runter gesetzt bzw. gelöscht (über den entsprechenden ImageIndex). Da ich aber gerne auch noch Images in der Spalte verwenden möchte und ich somit einzelene Images zu einem grösseren kombinieren müsste, habe ich die Lösung in der Schriftart WingDings3 gefunden, in der die Sortiersymbole vorhanden sind.
Da fangen nun meine Probleme an.
Soweit mit bekannt, müsste ich Schriftart der Überschrift bzw. des Listviews auf WingDings3 setzen. Da mir dann alle normalen ASCII-Codes fehlen, lässt sich die Ausgabe des Listviews wohl nur von wenigen Menschen lesen.
Doch zum Glück gibt es da ja die Zeichentabelle und naiv dachte ich, in die Zwischenablage kopieren und im Source eingefügen, so wie in Word, und Schwupps habe ich das Symbol. Naja, hat nicht funktioniert, wie sollte es auch!
Dieses treibt mich zur Frage, wie Word respektive Windows die Darstellung dieser Zeichen erreicht, obwohl eine Markierung des Textes nicht zu einer Anzeige des verwendeten Fonds führt, wie ich erwartet hätte.
Vielen Dank für eure Hilfe
neoxTom
-
Du kannst die Header selbst zeichnen. Folgender Code soll nur als Beispiel dienen. Die Positionierung des Pfeils ist noch nicht sehr gut.
public partial class Form1 : Form { private bool sortOrderAscending = false; // Sortierreihenfolge private int sortColumnIndex = 0; // Sortierte Spalte public Form1() { InitializeComponent(); listView1.View = View.Details; listView1.OwnerDraw = true; listView1.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader); listView1.DrawItem += new DrawListViewItemEventHandler(listView1_DrawItem); listView1.DrawSubItem += new DrawListViewSubItemEventHandler(listView1_DrawSubItem); } void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { e.DrawDefault = true; // Brauchen wir nicht selbstzuzeichnen. } void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { e.DrawDefault = true; // Brauchen wir nicht selbstzuzeichnen. } private readonly Font ArrowFont = new Font("Webdings", 10); void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { e.DrawBackground(); e.DrawText(); if (e.ColumnIndex == sortColumnIndex) { string arrow = sortOrderAscending ? "5" : "6"; TextRenderer.DrawText( e.Graphics, arrow, ArrowFont, e.Bounds, Color.Black, TextFormatFlags.Left | TextFormatFlags.VerticalCenter ); } } }
-
Uih, so viel Mühe hatte ich nicht erwartet.
Vielen Dank für den Hinweis und den Sourcecode.Ich habe gedacht, man erhält die Funktionalität auch ohne etwas selbst zu zeichnen. In dieser Hinsicht finde ich den Listview ein wenig schwach, da so etwas wie die Sortierpfeile eigentlich schon implementiert sein sollten.
Naja, so ist das halt mit den Objekten, vieles bekommt man geschenkt, anderes muss man immer wieder hinzu entwickeln. Blöd, das ich immer die Probleme lösen muss, die man nicht geschenkt bekommt.
Gruss
neoxTom