C# TabController?
Hallo, ich arbeite momentan an ein Projekt aber ich komme nicht weiter ich habe in ein Tab und ein Knopf der einen anderen Tab erstellt wird der code sieht dazu so aus
jetzt habe ich aber das Problem Wenn man im Tab ist, der über den code erstellt, wurde das, private void tabexecute nicht funktioniert (siehe code https://pastebin.com/hqzRbUzG)
Weil ich nicht weis wie man denn HtmlDocument document = webBrowser1.Document; so umbauen kann, dass er immer denn Webbrowser nimmt, wo er grade im Tab drin ist. Der Name des Webbrowser wird jedes Mal beim Erstellen eines Tabs random generiert.
Ich bedanke mich im voraus.
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.