none
Auf Controls in Form 1 zugreifen RRS feed

  • Frage

  • Hallo alle zusammen,

    ich weiß das Thema gibt es bereits aber ich kann es nicht anwenden da ich selber noch nicht lange Programmiere.

    hier also mein Problem.

     

    ich möchte auf die Controls in Form1 zugreifen. Meinen Fehler habe ich bereits erkannt. wenn ich Form1 form1 = new Form1(); schreibe gibt es eine Endlosschleife.

    normalerweise initialisiere ich so eine Klasse in einer anderen. ich habe für jedes Control eine Eigenschaft geschrieben

    z.B.  public TableLayoutPanel _Main_Panel { get { return _main_panel; } }.

    Der Debugger gibt in diesem Fall keinen Fehler zurück bis ich dann versuche es zu kompilieren.

     

    wie kann ich also von einer Klasse auf die Controls in meiner Form1 zugreifen?

     

     

    mfg

    Thompson

    • Bearbeitet L4a-Thompson Samstag, 30. Juli 2011 16:19 Rechtschreibfehler, Entschuldigung
    Samstag, 30. Juli 2011 16:18

Antworten

  • Hallo L.,

    Du hattest immer mit „new ReadFile()“, oder „new Form1()“ eine ganz andere (neue) Instanz als die Original-Instanz erzeugt, was natürlich zu Fehlern führte.
    Die Lösung habe ich bei der Form1 mit einer öffentlichen statischen Methode HauptForm() in einer Util-Klasse implementiert, die eigentlich nur Application.OpenForms[0] zurückgibt. Es gibt hier theoretisch viele Möglichkeiten/Varianten, ähnliches zu bewerkstelligen.
    In der Klasse ReadFile habe ich dann folgenden Konstruktor eingefügt:
       public ReadFile() { form1 = Util.HauptForm(); }
    
    Beim Füllen der ComboBOx am Ende noch:
      form1._Programme_Combobox.SelectedIndex = 0;
    
    und in ShowSerial noch einen Konstruktor eingefügt:
        public Show_Serial(ReadFile readFile) 
        {
          form1 = Util.HauptForm();
          this.readFile = readFile;
        }
    
    ___________________
    Also für andere Leser ... Methoden, die zur Lösung angewandt wurden:
    • 1) Application.OpenForms[0] für die Nutzung der Hauptform-Instanz (in einfachen Fällen),
           sodass keine Übergabe der Instanz erfolgen muß.
    • 2) Übergabe von Parametern im Konstruktor

    Weiter typische Möglichkeiten wäre das Setzen einer Eigenschaft oder öffentliche statische Instanzen, oder über neue Techniken auch mittels MEF eine automatischen Finden relevanter Instanzen.


    ciao Frank
    Montag, 1. August 2011 19:39

Alle Antworten

  • Hallo Thompson,

    Das kannst Du so (mit Eigenschaften) machen. Hier ein funktionierendes Beispiel:

    using System.Windows.Forms;
    
    namespace WinControlDemo
    {
      public partial class Form1 : Form
      {
        TableLayoutPanel tlpAnsicht;
        private int anzahlSpalten = 2;
        private int anzahlZeilen = 2;
    
        public Form1()
        {
          InitializeComponent();
          this.tlpAnsicht = new TableLayoutPanel();
          this.SuspendLayout();
          this.tlpAnsicht.Anchor = AnchorStyles.None;
          this.tlpAnsicht.ColumnCount = anzahlSpalten;
          this.tlpAnsicht.RowCount = anzahlZeilen;
          for (int zeile = 0; zeile < anzahlSpalten; zeile++)
          {
            this.tlpAnsicht.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100 / anzahlSpalten));
            for (int spalte = 0; spalte < anzahlZeilen; spalte++)
            {
              this.tlpAnsicht.Controls.Add(NeuerButton(zeile, spalte), spalte, zeile);
              this.tlpAnsicht.RowStyles.Add(new RowStyle(SizeType.Percent, 100 / anzahlZeilen));
            }
          }
          this.tlpAnsicht.Name = "tlpAnsicht";
          this.tlpAnsicht.Size = new System.Drawing.Size(200, 100);
          this.tlpAnsicht.TabIndex = 0;
          Controls.Add(tlpAnsicht);
          this.ResumeLayout();
        }
    
        public TableLayoutPanel MainPanel { get { return tlpAnsicht; } }
    
        private Button NeuerButton(int zeile, int spalte)
        {
          Button btn = new Button();
          btn.Name = "btn" + zeile + "_" + spalte;
          btn.Anchor = AnchorStyles.None;
          btn.Text = btn.Name;
          btn.UseVisualStyleBackColor = true;
          btn.Click += (s, e) => new Klasse().Demo(this);
          return btn;
        }
      }
    
      //==============
    
      class Klasse
      {
        public void Demo(Form1 form1)
        {
          MessageBox.Show("Der Name des MainPanel ist: " +
            form1.MainPanel.Name);
        }
      }
    }
    

    Man braucht nicht unbedingt die Form-Instanz im Konstruktor übergeben.
    Es gäbe viele weitere alternative Möglichkeiten.

    Man kann zum Beispiel auch etwas wie folgendes machen:

      public void Demo() // Aufruf dann etwa:  new Klasse().Demo()
      {
         Form1 form1 = Application.OpenForms[0] as Form1;
         MessageBox.Show("Der Name des MainPanel ist: " +
           form1.MainPanel.Name);
      }
    

    Oder man kann auf die Controls (wie etwa MainPanel bei mir) gehen und und im Designer bei Modifiers auf public stellen.
    Dadurch kann man dann ohne Eigenschaft direkt auf die Controls zugreifen.
    Aber es schon sauber, es über Eigenschaften zu machen.


    ciao Frank


    Samstag, 30. Juli 2011 18:46
  • Vielen dank für eure hilfe aber ich habe es leider nicht hinbekommen.

    ich habe insgesamt 5 klassen erstellt die alle aufeinander zugreifen müssen. Verstehen tue ich leider nicht warum es nicht funktioniert da ich erst angefangen habe fehlen mir die zusammen hänge. als ich noch alles in einer klasse hatte hat dies wunderbar funktioniert aber jetzt da ich etwas ordnung schaffen wollte geht gar nix mehr.

     

    würde jemand bereit erklären meinen Code mal durchzuschauen und meine fehler mir offen zu legen?

     

    Vielen dank schon mal im Vorraus.

    Sonntag, 31. Juli 2011 19:31
  • Hallo L.,

    • würde jemand bereit erklären meinen Code mal durchzuschauen und meine fehler mir offen zu legen?

    ok, maile mir das Projekt mal.  Email: FrankAddDzaebel.NET

     


    ciao Frank
    Sonntag, 31. Juli 2011 20:04
  • mail ist heute raus gegangen
    Montag, 1. August 2011 16:51
  • Hallo L.,

    Du hattest immer mit „new ReadFile()“, oder „new Form1()“ eine ganz andere (neue) Instanz als die Original-Instanz erzeugt, was natürlich zu Fehlern führte.
    Die Lösung habe ich bei der Form1 mit einer öffentlichen statischen Methode HauptForm() in einer Util-Klasse implementiert, die eigentlich nur Application.OpenForms[0] zurückgibt. Es gibt hier theoretisch viele Möglichkeiten/Varianten, ähnliches zu bewerkstelligen.
    In der Klasse ReadFile habe ich dann folgenden Konstruktor eingefügt:
       public ReadFile() { form1 = Util.HauptForm(); }
    
    Beim Füllen der ComboBOx am Ende noch:
      form1._Programme_Combobox.SelectedIndex = 0;
    
    und in ShowSerial noch einen Konstruktor eingefügt:
        public Show_Serial(ReadFile readFile) 
        {
          form1 = Util.HauptForm();
          this.readFile = readFile;
        }
    
    ___________________
    Also für andere Leser ... Methoden, die zur Lösung angewandt wurden:
    • 1) Application.OpenForms[0] für die Nutzung der Hauptform-Instanz (in einfachen Fällen),
           sodass keine Übergabe der Instanz erfolgen muß.
    • 2) Übergabe von Parametern im Konstruktor

    Weiter typische Möglichkeiten wäre das Setzen einer Eigenschaft oder öffentliche statische Instanzen, oder über neue Techniken auch mittels MEF eine automatischen Finden relevanter Instanzen.


    ciao Frank
    Montag, 1. August 2011 19:39