C# TabController?

1 Antwort

Es sieht so aus, als würdest du das alles in einer Klasse (bspw. der Forms-Klasse) vornehmen. Mit jedem neuen Tab, den du anlegst, zeigst du dann mit deinen Feldern auf die neuen Komponenten (Webbrowser, Button, etc.) des neuen Tabs. Die Referenzen auf die Komponenten des zuvor erstellten Tabs hingegen gehen dabei erst einmal verloren.

Erstelle stattdessen eine Klasse, die ein Tab-Item abbildet. Instanzen, die von dieser Klasse erstellt werden, haben anschließend ihren eigenen Zustand. Wenn man also bspw. ein Objekt A von der Klasse kreiert, verweist dessen Feld _webBrowser auf die eigene WebBrowser-Komponente. Nicht auf die eines anderen Tabs.

public class BrowserTabPage : TabPage
{
  private Button _button;
  private WebBrowser _webBrowser;
  // etc. ...

  public BrowserTabPage(int tabPageIndex)
  {
    // setup tab item page (set title, add controls, etc.) ...
  }

  private void OnButtonClick(object sender, EventArgs e)
  {
    // invoke Lua scripts, etc. ...
  }
}     

Erstellen eines neuen Tabs:

public void CreateNewTab()
{
  yourTabControl.Controls.Add(new BrowserTabPage(++tabPageIndex));
}

Zum Schluss würde ich noch ein paar Ratschläge / Tipps weitergeben, die mir bei Ansicht deines Codes eingefallen sind.

1) Benenne Variablen richtig (eindeutig, aussagekräftig) und vermeide Abkürzungen. Du tust jedem der deinen Code liest (und das wärst in erster Linie du) einen Gefallen.

Des Weiteren würde ich mich an dem für C# typischen PascalCase-Stil halten. Methodennamen beginnen demnach mit einem Großbuchstaben (und das Gleiche gilt ebenso für den Anfangsbuchstaben eines Wortes, wenn sich der Methodenbezeichner aus mehreren Wörtern zusammensetzt): IrgendeinBezeichnerInPascalCaseStil. Dies vereinfacht den Lesefluss.

2) Namespaces sollten als using im Dateikopf aufgeführt werden. Sie im Code auszuschreiben (vor allem, wenn es unnötig ist), macht den Code nur länger.

using System.Windows.Forms;

// ...
Button otherButton = System.Windows.Forms.Button(); // redundant namespace
Button button = new Button(); // better

3) Das Anhängen des Event Handler lässt sich vereinfachen.

button.Click += new System.EventHandler(DoSomething); // too long
button.Click += DoSomething; // short style

4) Deiner Frage nach zu urteilen bist du in den OOP-Grundlagen noch eher wenig vertraut. Das solltest du besser nachholen, bevor du an deinem Projekt weitermachst.