Entwickler-Ecke
WinForms - Font Werte speichern
Csharp-programmierer - Sa 12.03.16 13:34
Titel: Font Werte speichern
Hallo ihr Experten.
Ich habe eine Form mit 5 Buttons, die alle dem selben Ereignis unterliegen. In diesem Ereignis wird ein FontDialog aufgerufen und der Button, der gedrückt wurde, bekommt als Text die ausgewählte Schriftart:
C#-Quelltext
1: 2: 3: 4: 5:
| if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { Button b = sender as Button; b.Text = fontDialog1.Font.Name.ToString(); } |
Gespeichert wird das ganze so:
C#-Quelltext
1: 2: 3: 4:
| if (this.button21.Text != "") f.Font1 = new Font(this.button21.Text, 11.0f); else f.Font1 = new Font("- - -", 11.0f); |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| [XmlIgnore] public Font Font1 { get; set; } [XmlElement("Font1")] public string _font1 { get { if (Font1 == null) return null;
var converter = TypeDescriptor.GetConverter(typeof(Font)); return converter.ConvertToString(Font1); } set { var converter = TypeDescriptor.GetConverter(typeof(Font)); Font1 = (Font)converter.ConvertFromString(value); } } |
Das klappt. Wenn aber ein Button keinen Text hat, wird Microsoft Sans Serif als Schriftart angezeigt (wahrscheinlich wegen - - -). Aber wie kann ich es machen, dass der leere Button beim Laden leer bleibt?
Ralf Jansen - Sa 12.03.16 14:34
Zitat: |
C#-Quelltext 1:
| f.Font1 = new Font("- - -", 11.0f); | |
Wenn du keinen Font hast setzt doch Font1 einfach auf null?
Csharp-programmierer - Sa 12.03.16 14:51
Das habe ich versuche. Doch beim Laden kommt dann der Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Laden:
C#-Quelltext
1:
| this.button1.Text = toolbox.Font1.Name; |
Ralf Jansen - Sa 12.03.16 15:04
Zitat: |
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt |
Das "wo" sollte dir helfen das "warum" zu bestimmen.
Csharp-programmierer - Sa 12.03.16 15:12
Das verstehe ich jetzt nicht. Oder soll ich das catch { } leer lassenP
Ralf Jansen - Sa 12.03.16 15:19
Zitat: |
Das verstehe ich jetzt nicht. Oder soll ich das catch { } leer lassenP |
Das verstehe wiederum ich nicht ;) Was für ein catch?
Wenn du eine Fehlermeldung bekommst bekommst du auch gesagt wo die aufgetreten ist. Erst recht wenn dir das beim debuggen passiert. Wenn du dir die konkrete Codestelle dann ansiehst sollte sich klären lassen warum die Fehlermeldung auftritt.
Csharp-programmierer - Sa 12.03.16 15:22
Der Code kommt mir an der Stelle um die Ohren geflogen, wo der Button den Text der Font annehmen soll, der Button beim Speichern aber leer war :-)
Ralf Jansen - Sa 12.03.16 16:07
Das ist dann offensichtlich Code der nichts mit dem zu tun hat denn du hier zeigst.
Th69 - Sa 12.03.16 17:17
Csharp-programmierer hat folgendes geschrieben : |
Laden:
C#-Quelltext 1:
| this.button1.Text = toolbox.Font1.Name; | |
Ist doch logisch, daß dann eine
NullReferenceException kommt, wenn
Font1 null ist (denn ein nicht vorhandenes Objekt hat keinen Namen...).
Wenn du schon C#6 (d.h. VS 2015) benutzt, dann kannst du z.B. folgendes schreiben:
C#-Quelltext
1:
| this.button1.Text = toolbox.Font1?.Name; |
Ansonsten einfach selber auf Null prüfen:
C#-Quelltext
1:
| this.button1.Text = (toolbox.Font1 != null)? toolbox.Font1.Name : "---"; |
Diese Grundlagen solltest du aber langsam beherrschen.
Edit: Da
Christian S. mir diese Woche
diesen eleganten Code [
http://www.entwickler-ecke.de/viewtopic.php?p=699023#699023] gezeigt hat, geht auch (mit C#6) folgendes
C#-Quelltext
1:
| this.button1.Text = toolbox.Font1?.Name ?? "---"; |
Csharp-programmierer - Sa 12.03.16 23:50
Vielen Dank. Jetzt funktioniert es :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!