Benutzer mit den meisten Antworten
Funktion Control Texte in einer Form ersetzen

Frage
-
Hallo Forum,
ich möchte in einer Form einige Texte ersetzen und die Objekte in eine Liste eintragen.
Diese können auch in einem Container sein. Ich muss also die ganze Form durchsuchen. Dazu habe ich folgenden Ansatz. Komme gerade aber nicht weiter.
private void button3_Click(object sender, EventArgs e) { richTextBox1.Text = ""; ObjekteSuche(this); } private void ObjekteSuche(Control xx) { foreach (Control InForm in xx.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = "gefunden"; richTextBox1.Text += InForm.ToString() + "\n"; richTextBox1.Text += InForm.Text.ToString() + "\n"; richTextBox1.Text += " - - - " + "\n"; } else { //MessageBox.Show("XX = " + InForm.Text.ToString()); //ObjekteSuche(xx); } } }
Frage : Wie kann ich alle Labels und Buttons finden
und wie kann ich auf einem TabControl die Texte auf den "Reitern" ändern.
Gruß Roland- Bearbeitet Robert Breitenhofer Freitag, 13. Mai 2011 06:48 Formatierung
Antworten
-
Hallo Roland,
wenn Du Steuerelemente suchen möchtest, die in weiteren Containern, wie Panel oder GroupBox verschachtelt sein können, musst Du Deine Methode "ObjekteSuche" rekursiv aufrufen und gibst dabei das aktuelle Steuerelement aus der Steuerelemente Auflistung, die Du gerade bearbeitest als Startpunkt an. Etwa:
private void button1_Click(object sender, EventArgs e) { ObjekteSuche(this); } private void ObjekteSuche(Control xx) { foreach (Control InForm in xx.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = "gefunden"; richTextBox1.Text += InForm.ToString() + "\n"; richTextBox1.Text += InForm.Text.ToString() + "\n"; richTextBox1.Text += " - - - " + "\n"; } else { ObjekteSuche(InForm); } } }
und wie kann ich auf einem TabControl die Texte auf den "Reitern" ändern.
Die TabPages Eigenschaft des TabControl liefert eine Auflistung aller Reiter. Den Text eines Reiters kannst Du bspw. so ändern:
tabControl1.TabPages[0].Text = "Foo";
Im Kontext Deiner Objektsuche im o.g. Beispiel, werden die einzelnen TabPages auch bei der Enumeration der Steuerelemente aufgeführt. Der Typ ist hier dann TabPage.
Verwende bitte in Zukunft für das Posten von Quelltext die Funktion "Codeblock einfügen" im Foren-Editor, aber füge nicht vorformatierten Text aus Visual Studio direkt hier ein, da die Forensoftware mit dieser Formatierung nichts anfangen kann und der Code nicht mehr lesbar ist.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Elmar Boye Donnerstag, 28. April 2011 14:11
- Als Antwort markiert Robert Breitenhofer Freitag, 13. Mai 2011 06:49
-
Hallo Roland,
die ToolStrip/MenuStrip Einträge werden nicht in der Controls Auflistung des Formulars geführt. Das habe ich missverständlich dargestellt. Die ToolStrip Steuerelemente haben einen eigenen Auflistungstyp ToolStripCollection. Hierfür benötigst Du dann eine separate Methode, die diese durchläuft und die Einträge ändert/findet. Quick & Dirty:
private void button1_Click(object sender, EventArgs e) { ObjekteSuche(this); } private void ObjekteSuche(Control xx) { foreach (Control InForm in xx.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = "gefunden"; richTextBox1.Text += InForm.ToString() + "\n"; richTextBox1.Text += InForm.Text.ToString() + "\n"; richTextBox1.Text += " - - - " + "\n"; } else if (InForm is MenuStrip) { ObjekteSuche(((MenuStrip)InForm).Items); } else { ObjekteSuche(InForm); } } } private void ObjekteSuche(ToolStripItemCollection xx) { foreach (ToolStripItem InForm in xx) { if (InForm is ToolStripDropDownItem) { ObjekteSuche(((ToolStripDropDownItem)InForm).DropDownItems); } if (InForm is ToolStripMenuItem) { InForm.Text = "gefunden"; richTextBox1.Text += InForm.ToString() + "\n"; richTextBox1.Text += InForm.Text.ToString() + "\n"; richTextBox1.Text += " - - - " + "\n"; } } }
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Elmar Boye Montag, 2. Mai 2011 09:38
- Als Antwort markiert Robert Breitenhofer Freitag, 13. Mai 2011 06:48
-
Hallo Roland,
jetzt wird es klarer. Beim Erstaufruf möchtest Du eine DataTable übergeben, bei den rekursiven Folgeaufrufen nicht mehr. Eine Option wäre hier mit zwei unterschiedlichen Methoden zu arbeiten und den Verweis auf die DataTable auf Klassenebene zu speichern. Grob:
namespace FormObjekteAuslesen { class Class1 { System.Data.DataTable _ersetzungstabelle = null; public void MaskenTextErsetzen(Control FormX, System.Data.DataTable Ersetzungstabelle) { _ersetzungstabelle = Ersetzungstabelle; MaskenTextErsetzenInternal(FormX); } private void MaskenTextErsetzenInternal(Control FormX) { foreach (Control InForm in FormX.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = UebersetzungSuchen(InForm.Name.ToString()); } else { MaskenTextErsetzenInternal(InForm); } if (InForm is TabPage)
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Elmar Boye Samstag, 7. Mai 2011 10:09
- Als Antwort markiert Robert Breitenhofer Freitag, 13. Mai 2011 06:48
Alle Antworten
-
Hallo Roland,
wenn Du Steuerelemente suchen möchtest, die in weiteren Containern, wie Panel oder GroupBox verschachtelt sein können, musst Du Deine Methode "ObjekteSuche" rekursiv aufrufen und gibst dabei das aktuelle Steuerelement aus der Steuerelemente Auflistung, die Du gerade bearbeitest als Startpunkt an. Etwa:
private void button1_Click(object sender, EventArgs e) { ObjekteSuche(this); } private void ObjekteSuche(Control xx) { foreach (Control InForm in xx.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = "gefunden"; richTextBox1.Text += InForm.ToString() + "\n"; richTextBox1.Text += InForm.Text.ToString() + "\n"; richTextBox1.Text += " - - - " + "\n"; } else { ObjekteSuche(InForm); } } }
und wie kann ich auf einem TabControl die Texte auf den "Reitern" ändern.
Die TabPages Eigenschaft des TabControl liefert eine Auflistung aller Reiter. Den Text eines Reiters kannst Du bspw. so ändern:
tabControl1.TabPages[0].Text = "Foo";
Im Kontext Deiner Objektsuche im o.g. Beispiel, werden die einzelnen TabPages auch bei der Enumeration der Steuerelemente aufgeführt. Der Typ ist hier dann TabPage.
Verwende bitte in Zukunft für das Posten von Quelltext die Funktion "Codeblock einfügen" im Foren-Editor, aber füge nicht vorformatierten Text aus Visual Studio direkt hier ein, da die Forensoftware mit dieser Formatierung nichts anfangen kann und der Code nicht mehr lesbar ist.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Elmar Boye Donnerstag, 28. April 2011 14:11
- Als Antwort markiert Robert Breitenhofer Freitag, 13. Mai 2011 06:49
-
Hallo Roland,
ja, Du kannst auch die Texte in einem MenuStrip anpassen. Allgemeiner Typ den alle ToolStrip Einträge gemein haben, wäre ToolStripItem, spezifisch fürs Menü wäre dies ToolStripMenuItem.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
Danke für den Hinweis. Habe nun schon einiges versucht, komme aber nicht so richtig weiter. Das Menü wird nicht durchsucht und den Text bekomme ich nicht verändert. Kannst Du mir sagen nach was ich die Abfrage machen muss damit alle Unterpunkte im Menü durchsucht werden ?
Gruß Roland -
Hallo Roland,
die ToolStrip/MenuStrip Einträge werden nicht in der Controls Auflistung des Formulars geführt. Das habe ich missverständlich dargestellt. Die ToolStrip Steuerelemente haben einen eigenen Auflistungstyp ToolStripCollection. Hierfür benötigst Du dann eine separate Methode, die diese durchläuft und die Einträge ändert/findet. Quick & Dirty:
private void button1_Click(object sender, EventArgs e) { ObjekteSuche(this); } private void ObjekteSuche(Control xx) { foreach (Control InForm in xx.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = "gefunden"; richTextBox1.Text += InForm.ToString() + "\n"; richTextBox1.Text += InForm.Text.ToString() + "\n"; richTextBox1.Text += " - - - " + "\n"; } else if (InForm is MenuStrip) { ObjekteSuche(((MenuStrip)InForm).Items); } else { ObjekteSuche(InForm); } } } private void ObjekteSuche(ToolStripItemCollection xx) { foreach (ToolStripItem InForm in xx) { if (InForm is ToolStripDropDownItem) { ObjekteSuche(((ToolStripDropDownItem)InForm).DropDownItems); } if (InForm is ToolStripMenuItem) { InForm.Text = "gefunden"; richTextBox1.Text += InForm.ToString() + "\n"; richTextBox1.Text += InForm.Text.ToString() + "\n"; richTextBox1.Text += " - - - " + "\n"; } } }
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Elmar Boye Montag, 2. Mai 2011 09:38
- Als Antwort markiert Robert Breitenhofer Freitag, 13. Mai 2011 06:48
-
Hallo Forum,
manchmal ist es ganz einfach : Austauschen der GridView Headertexte
Für alle die es interessiert, die Lösung :
if (InForm is DataGridView) { DataGridTexte(((DataGridView)InForm)); }
private void DataGridTexte(DataGridView xx) { foreach (DataGridViewColumn Column in xx.Columns) { Column.HeaderText = "gefunden"; } }
Leider habe ich noch Probleme wenn ich es über eine Klasse machen möchte. Hat da jemand eine Idee ?
Danke.
Gruß Roland -
Leider habe ich noch Probleme wenn ich es über eine Klasse machen möchte.Hallo Roland,wenn Du näher erläuterst welche Art von Problemen Du da hast, fällt es sicher leichter Dir da zu helfen. Hast Du den Namespace System.Windows.Forms importiert:
using System.Windows.Forms; namespace MyAppNamespace { public class MyClass { // ... } }
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
Danke das hatte ich übersehen.
Nun habe ich nur noch ein Problem, wie kann ich die Tabelle mit den Ersetzungstexten übergeben ohne das die Tabelle x mal "kopiert" wird.
Anbei etwas Code aus der Klasse.
namespace FormObjekteAuslesen { class Class1 { public void MaskenTextErsetzen(Control FormX, System.Data.DataTable Ersetzungstabelle) { foreach (Control InForm in FormX.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = UebersetzungSuchen(InForm.Name.ToString()); } else { MaskenTextErsetzen(InForm); } if (InForm is TabPage)
Problem ist der Aufruf "MaskenTexteErsetzen(InForm);" Kein Überladen für die MaskenTextErsetzen-Methode nimmt 1 Argument an.
Wie kann ich das lösen ?
Gruß Roland -
Hallo Roland,
Nun habe ich nur noch ein Problem, wie kann ich die Tabelle mit den Ersetzungstexten übergeben ohne das die Tabelle x mal "kopiert" wird.
Eine DataTable ist ein Referenztyp und somit wird bei der Übergabe an eine Methode lediglich ein Verweis auf die bestehende Objektinstanz übergeben und keine Kopie erzeugt.
public void MaskenTextErsetzen(Control FormX, System.Data.DataTable Ersetzungstabelle)
Problem ist der Aufruf "MaskenTexteErsetzen(InForm);" Kein Überladen für die MaskenTextErsetzen-Methode nimmt 1 Argument an.
Nun, Deine Methode erwartet auch 2 Argumente. Einmal das betreffende Steuerelement/Formular, als auch eine DataTable, die Du hier nicht angegeben hast.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Roland,
jetzt wird es klarer. Beim Erstaufruf möchtest Du eine DataTable übergeben, bei den rekursiven Folgeaufrufen nicht mehr. Eine Option wäre hier mit zwei unterschiedlichen Methoden zu arbeiten und den Verweis auf die DataTable auf Klassenebene zu speichern. Grob:
namespace FormObjekteAuslesen { class Class1 { System.Data.DataTable _ersetzungstabelle = null; public void MaskenTextErsetzen(Control FormX, System.Data.DataTable Ersetzungstabelle) { _ersetzungstabelle = Ersetzungstabelle; MaskenTextErsetzenInternal(FormX); } private void MaskenTextErsetzenInternal(Control FormX) { foreach (Control InForm in FormX.Controls) { if (InForm is Label || InForm is Button) { InForm.Text = UebersetzungSuchen(InForm.Name.ToString()); } else { MaskenTextErsetzenInternal(InForm); } if (InForm is TabPage)
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Elmar Boye Samstag, 7. Mai 2011 10:09
- Als Antwort markiert Robert Breitenhofer Freitag, 13. Mai 2011 06:48