Autor |
Beitrag |
DoTa
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.06.09 11:54
Ich sitze gerade an meiner Vertieferarbeit und habe die Aufgabe eine Sprachsteuerung zu integrieren bzw. zu erstellen.
Um die Controls anzusteuern, brauchen diese bestimmte Eigenschaften, wie z.B. "Ansprechname", "Zugangseigenschaft".. (wen es interessiert, dem erläutere ich es gern ausführlicher).
Meine Idee war es zunächst, diese über eine Datenbank abzurufen und zu speichern, jedoch bin ich mittlerweile davon abgekommen, da ich keine Schleife über alle Formulare bilden kann.
Also dachte ich mir, wie auch zu Beginn der Arbeit, setzen wir doch einfach eigene Eigenschaften in die Controls. Da ich aber auf ein bestehendes Programm aufbaue, hatte ich keine Lust alle Controls durch meine CustomControls zu ersetzen.
Nun aber zu meiner eigentlichen Frage:
Kann man die System.Windows.Form.Control um ein paar Eigenschaften ergänzen? Da ja alle Controls (ob Textbox oder Checkbox) von dieser Klasse erben.
Oder habt ihr andere Lösungsvorschläge?
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Do 25.06.09 12:38
Hallo und
DoTa hat folgendes geschrieben : | Kann man die System.Windows.Form.Control um ein paar Eigenschaften ergänzen? Da ja alle Controls (ob Textbox oder Checkbox) von dieser Klasse erben. |
Eigentlich wäre das nichts anderes als CustomControl; aber das hilft dir natürlich nichts (wie dir offensichtlich bewusst ist), weil TextBox usw. von Control abgeleitet ist und nicht von CustomControl.
Da du mit 3.5 arbeitest, könnten die Erweiterungsmethoden (Extensions) helfen; aber ich arbeite noch nicht damit, habe also keine Ahnung.
Übrigens gibt es Control.Tag-Eigenschaft, über die du beliebige Objekte anhängen kannst, z.B. auch eine Dictionary<key, value>. Vielleicht hilft das am schnellsten weiter.
Gruß Jürgen
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 25.06.09 12:41
JüTho hat folgendes geschrieben : | Da du mit 3.5 arbeitest, könnten die Erweiterungsmethoden (Extensions) helfen; aber ich arbeite noch nicht damit, habe also keine Ahnung. |
Extension Methods sind einfach nur statische Methoden mit ein bisschen netterer Syntax, damit kann man also keine Eigenschaften zu "fertigen" Klassen hinzufügen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 25.06.09 12:49
Dafür bietet sich ein ExtenderProvider an. Die werden z.B. vom Framework auch für die Lokalisierung, ErrorProvidern oder bei Tooltips verwendet um Controls um Properties zu ergänzen.
Guckst du z.B. hier.
|
|
DoTa 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.06.09 14:54
Danke zunächst an alle!!!
JüTho hat folgendes geschrieben : | Hallo und
Eigentlich wäre das nichts anderes als CustomControl; aber das hilft dir natürlich nichts (wie dir offensichtlich bewusst ist), weil TextBox usw. von Control abgeleitet ist und nicht von CustomControl.
|
Dachte eher daran, eine eigene System.Forms.dll zu erstellen, in der Hoffnung, dass dort alle verwendeten Properties beschrieben sind. D.h. ich hätte nur den Verweis auf die (System.Forms.dll) auf meine Eigene verändern müssen.
Werde mich erstmal mit den Extensions auseinander setzen...
Gib dann später Bescheid, ob es funktioniert hat.
|
|
DoTa 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.06.09 19:47
DoTa hat folgendes geschrieben : |
Gib dann später Bescheid, ob es funktioniert hat. |
Es hat leider nicht nicht mit dem ExtenderProvider funktioniert. Hat jmd. vielleicht noch andere Beispiele zu diesem Thema, hört sich nämlich interessant an.
Ansonsten bleibt Frage weiterhin bestehen, kann man ein oder mehrere Eigenschaften nachträglich zu allen Controls hinzufügen? Am liebsten wäre mir, wenn man diese dann auch über die Eigenschaften im Visual-Studio verändern kann.
Danke im vorraus.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 25.06.09 19:47
DoTA hatte per PN nach einem Beispiel bezüglich ExtenderProvider gefragt.
@Dota : demnächst Bitte keine Fragen mehr via PN (zumindest nicht an mich). Das Forum selbst ist dafür geeigneter.
Im Beispiel eine ExtenderProvider als Component der die Textbox Klasse um eine Property "MeineProperty ergänzt".
Wenn du das Beispiel kompilierst erhälst du eine Componente die du auf eine Form werfen kannst und dann für alle Textboxen der Form die neue Property bekommst.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| [ProvideProperty("MeineProperty", typeof(Control))] public partial class TextBoxExtender : Component, IExtenderProvider { private Hashtable meineProperties = new Hashtable(); public TextBoxExtender() { }
public TextBoxExtender(IContainer container) { container.Add(this); }
public bool CanExtend(object extendee) { return (extendee is TextBox); }
public string GetMeineProperty(Control control) { if ((meineProperties.Contains(control) && (meineProperties[control] != null))) return (string)meineProperties[control]; return ""; }
public void SetMeineProperty(Control control, string value) { meineProperties[control] = value; }
} |
|
|
DoTa 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.06.09 20:21
Also dein Beispiel ist fehlerlos, jedoch, kriege ich keine neue Eigenschaft bei der Textbox angzeigt. In deinem Beispiel müsste dann ja "MeineProperty" als Eigenschaft zu sehen sein. Kann es daran liegen, dass ich hier zu Hause mit VS 2005 und .NET 2.0 arbeite?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 25.06.09 20:27
Die neue Property heißt an den Textboxen dann "MeineProperty on NameDesTextBoxExtenders". Das Aufnehmen des Namens der Extenderklasse muß sein da man ja mehrere Extender auf die Form werfen könnte die die gleichen Propertynamen liefern.
Ich selbst habs mit VS2008 probiert da funktioniert das Wunderbar. Sollte unter VS2005 aber genauso gehen und habe das auch dort schon(nicht mit diesem Beispiel) so gemacht.  Du hast nicht zufällig versucht die Property umzubennen und vergessen die Namen des Getters und Setters nachzuziehen?
|
|
DoTa 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.06.09 20:43
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 25.06.09 20:59
Du hast wahrscheinlich in VS eine neue Komponente angelegt und den Beispiel Code reinkopiert. Dann erhälst du auch eine *.Designer.cs Datei mit einer InitializeComponent Methode. Der Extender hat aber selbst keine designbare Oberflache. InitializeComponent ist also nicht notwendig. Ich würde die Designer.cs löschen und InitializeComponent wieder rauswerfen.
Das der nach dem Kompilieren verschiedet kann ich mir nicht erklären. Da gibt es eigentlich auch nichts einzustellen.
Kontrollier mal die Designer.cs Datei vor und nach dem kompilieren. Ist der Member für den Extender vorhanden? Ist der Code zum erzeugen des Extender in der InitializeComponent noch vorhanden nach dem kompilieren?
|
|
DoTa 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.06.09 21:31
Da war wohl irgendetwas zerschossen.
Hat nun wunderbar funktioniert. Ein riesengroßes Dankeschön an Dich und natürlich an alle anderen.
Werde den Extender verwenden. Vll. benutze ich statt einem Hashtable eine DB, aber im großen und ganzen bin sehr zufrieden, dass es nun weitergehen kann.
|
|