ListView: Zeilenumbruch verhindern im OwnerDraw-Modus



  • Hi,

    ich google jetzt schon eine Weile und finde kein Lösung, daher frage ich hier mal.

    Ich habe eine ListView mit View=Details und OwnerDraw=True. Wenn ich zur Laufzeit mir der Maus die Spalten verkleinere, werden bei den Strings lauter Zeilenumbrüche eingefügt anstatt dass der String verkürzt mit drei Punkten am Ende dargstellt wird.

    LabelWrap auf False zu stellen bringt nix, da das wohl nicht für den Detail-Modus gilt. Hat jemand eine Idee?

    Grüsse



  • Nachtrag: Hm, also so ungefähr weiss ich jetzt woran das liegt.
    Bei e.Graphics.DrawString hab ich für das Argument "layoutRectangle" den Wert "e.Bounds" übergeben, da passiert dann der Mist.
    Man kann stattdessen auch per Überladung "e.Bounds.X, e.Bounds.Y" übergeben, dann gibt's zwar keine Zeilenumbrüche mehr, aber das Textfeld wird dann nicht mehr verkürzt bei zu kleiner Spaltenbreite, nur abgeschnitten. Sieht auch nicht gut aus.

    Ist jetzt auch nicht so wichtig, aber falls jemand weiss wie ich das Textformat-Rectangle als Reaktion auf Spaltenbreiten-Verkleinerung per Maus anpassen muss, wär toll. Ich ahne aber schon dass das eine komplizierte Geschichte ist, die den Aufwand kaum lohnt.



  • Schau dir mal StringFormat.Trimming sowie die StringTrimming-Enumeration an (StringFormat kannst du dann als Überladung der DrawString-Methode mitgeben).

    So schauen die verschiedenen Möglichkeiten dann aus: http://blog.csharphelper.com/2011/05/05/use-the-stringformat-classs-line-trimming-values-in-c.aspx - such dir die für dich passende aus 😉



  • @Th69
    Ja super, vielen Dank, geht ja doch einfacher als ich dachte 🙂

    Ist aber doch ein ganz schönes Gefummel die Grösse und Position des Text-Rahmens zu berechnen, wenn man wie ich jetzt unterschiedliche Spalten-Formatierungen hat. Da bei mir eine Spalte zweizeilig ist und die einzeiligen Spalten vertikal-mittig sein sollen, hätte ich noch eine Frage am Rande für die Leute die sich mit sowas auskennen.

    Den oberen Abstand eines vertikal-mittigen Textrahmens berechne ich so:
    Rand = (int)(RowHeight / 2.00) - (int)Math.Round(Schriftart.SizeInPoints / 2.00, 0);

    Ich runde also die halbe Zeilenhöhe ab und runde die halbe Schriftgrösse auf, damit's auf jeden Fall reinpasst. Das ist aber irgendwie zu wenig, ich muss als Korrekturfaktor vom Rand noch 3 abziehen damit der Text nicht oben und unten abgeschnitten wird. Woran liegt das oder habe ich da einen Fehler drin?



  • Nachtrag: Bin jetzt fast fertig und musste noch an anderen Stellen solche kleinen Korrektur-Faktoren addieren, gehört wohl dazu. Nun taucht am Ende aber noch ein sehr seltsamer Fehler auf, den ich gar nicht verstehe (vielleicht ein Bug im Visual Studio):

    Bei den Spalten-Überschriften kann ich den Text nach Belieben horizontal und vertikal ausrichten (Near, Center, Far), das "StringTrimming.EllipsisCharacter" funktioniert einwandfrei.

    Anders bei den Daten-Zeilen, da funktioniert das Trimming nur wenn die Spalte linksbündig ist. Bei "Center" und "Far" keine Trimmung. Der Code ist praktisch der Gleiche wie bei den Spalten-Überschriften.
    Einziger Unterschied ist, dass ich bei den Überschriften die Textbreite mit "ListView.Columns[e.ColumnIndex].Width" auslese, bei den Daten-Spalten mache ich das mit "e.Graphics.MeasureString(e.SubItem.Text, TextFont).Width".
    Man muss die "gemessene" Textbreite da aber noch mit 4/3 multiplizieren, hab ich hier so gelesen und stimmt auch
    http://www.tek-tips.com/viewthread.cfm?qid=909509

    Also wenn da schon so ein Faktor-Bug im Visual-Studio drin ist, dann könnt's ja sein dass bei "Center" und "Far" das Trimming bei Daten-Zeilen auch verbuggt ist. Boah, bringt mich das drauf, ich geh mal besser schlafen, vielleicht hat ja morgen von Euch einer 'n Tipp.

    Grüsse


Anmelden zum Antworten