none
Funktion Control Texte in einer Form ersetzen RRS feed

  • 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
    Mittwoch, 27. April 2011 06:54

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
    Mittwoch, 27. April 2011 11:21
  • 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
    Freitag, 29. April 2011 14:03
  • 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
    Donnerstag, 5. Mai 2011 10:19

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
    Mittwoch, 27. April 2011 11:21
  • Hallo Thorsten,

    Danke habe es hinbekommen.

    Kann ich auch auf diese Weise auch die Texte in einem "nenuStrip" anpassen ?


    Gruß Roland
    Freitag, 29. April 2011 07:38
  • 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
    Freitag, 29. April 2011 07:49
  • 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
    Freitag, 29. April 2011 12:34
  • 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
    Freitag, 29. April 2011 14:03
  • Hallo Thorsten,

    Funktioniert Dank Deiner Hilfe. Hab es mit einer kleinen Änderung sofort hinbekommen.

    Besten Dank.


    Gruß Roland
    Freitag, 29. April 2011 19:52
  • Hallo Thorsten

    habe noch zwei kleine Fragen :

    1. Wie kann ich in einem GridView die Headertexte austauschen. Komme da einfach nicht weiter.

    2. Wenn ich das ganze in einer Klasse machen möchte, wie muss ich den Aufruf machen.

     

     


    Gruß Roland
    Montag, 2. Mai 2011 06:28
  • 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
    Mittwoch, 4. Mai 2011 12:55
  • 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
    Mittwoch, 4. Mai 2011 16:07
  • 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
    Donnerstag, 5. Mai 2011 06:25
  • 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
    Donnerstag, 5. Mai 2011 06:32
  • Hallo Thorsten,

    Danke für die Info.

    Das der "Fehler" darauf bassiert das ich keine DB angegeben habe war mir schon klar. Nur mit der Übergabe der DB das war mir so nicht ganz klar.

    Danke.

     


    Gruß Roland
    Donnerstag, 5. Mai 2011 10:11
  • 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
    Donnerstag, 5. Mai 2011 10:19