Frage

Vielleicht kenne ich .NET einfach noch nicht gut genug, aber ich habe noch keine zufriedenstellende Möglichkeit gefunden, diesen einfachen VB6-Code problemlos in .NET zu implementieren (angenommen, dieser Code befindet sich in einem Formular mit N Befehlsschaltflächen im Array Command1() und N TextBoxen im Array Text1()):

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

Ich weiß, dass es kein sehr nützlicher Code ist, aber er zeigt, wie einfach Steuerarrays in VB6 verwendet werden können.Was ist das einfachste Äquivalent in C# oder VB.NET?

War es hilfreich?

Lösung

Erstellen Sie eine allgemeine Liste von Textfeldern:

var textBoxes = new List<TextBox>();

// Create 10 textboxes in the collection
for (int i = 0; i < 10; i++)
{
    var textBox = new TextBox();
    textBox.Text = "Textbox " + i;
    textBoxes.Add(textBox);
}

// Loop through and set new values on textboxes in collection
for (int i = 0; i < textBoxes.Count; i++)
{
    textBoxes[i].Text = "New value " + i;
    // or like this
    var textBox = textBoxes[i];
    textBox.Text = "New val " + i;
}

Andere Tipps

Eine weitere nette Sache, die VB .NET bietet, ist die Verwendung eines einzigen Ereignishandlers, der mehrere Steuerelemente verarbeitet:

Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
        Handles TextBox1.TextChanged, _

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub

Es gibt kein real 1 zu 1 analog in .Net.Natürlich können Sie Arrays oder Listen von Steuerelementen eines bestimmten Typs erstellen, aber es gibt nichts, was das automatisch für Sie erledigt.

Allerdings habe ich noch nie ein Kontrollarray gesehen, das in .Net nicht in etwas umgestaltet werden konnte besser.Ein typisches Beispiel ist Ihr Beispiel.In dem von Ihnen geposteten Szenario verwenden Sie Steuerelementarrays, um eine Schaltfläche mit einem Textfeld zu koppeln.In .Net würden Sie dies wahrscheinlich mit einem benutzerdefinierten Steuerelement tun.Das benutzerdefinierte Steuerelement würde aus einer Schaltfläche, einem Textfeld und möglicherweise einem gemeinsam genutzten/statischen Timer bestehen.Das Formular verwendet mehrere Instanzen dieses benutzerdefinierten Steuerelements.Sie implementieren die für das Steuerelement erforderliche Logik einmal und sie wird in einer eigenen Quelldatei isoliert, die in der Quellcodeverwaltung verfolgt und bearbeitet werden kann, ohne dass eine Zusammenführung mit der größeren Formularklasse erforderlich ist, oder sie kann problemlos in mehreren Formularen oder sogar in mehreren Projekten wiederverwendet werden .Sie müssen sich auch keine Gedanken darüber machen, ob der Befehlsschaltflächenindex mit dem Textfeldindex übereinstimmt.

Die Verwendung eines benutzerdefinierten Steuerelements hierfür anstelle eines Steuerelementarrays ähnelt in etwa der Verwendung einer Klasse zum Gruppieren von Daten anstelle eines Arrays, da Sie Namen anstelle von Indizes erhalten.

Es gibt zwei Aspekte.

.NET unterstützt problemlos Arrays von Steuerelementen, VB6 musste lediglich einen Workaround verwenden, da die Verknüpfung von Ereignissen sonst sehr schwierig wäre.In .NET ist die dynamische Verknüpfung von Ereignissen einfach.

Der .NET-Formulardesigner unterstützt jedoch aus einem einfachen Grund keine Steuerelementarrays:Arrays von Steuerelementen werden zur Laufzeit erstellt/erweitert.Wenn Sie wissen, wie viele Steuerelemente Sie zur Kompilierzeit benötigen (so die Begründung), geben Sie ihnen unterschiedliche Namen und fügen Sie sie nicht in ein Array ein.

Ich weiß, dass es kein sehr nützlicher Code ist

Genau darum geht es.Warum eine Funktion haben, wenn sie nutzlos ist?

Bei Bedarf können Sie auch über den Namen auf ein Steuerelement zugreifen, was in etwa so aussieht:

Private Sub Command_Click(sender As Object, e As EventArgs) Handles Command1.Click, Command2.Click …
    Dim name As String = DirectCast(sender, Control).Name
    Dim index As Integer = Integer.Parse(name.Substring("Command".Length))
    Controls(String.Format("Text {0}", index)).Text = Timer.Value.ToString()
End Sub

Die Kompatibilitätsbibliothek von VisualBasic .NET enthält stark typisierte Steuerelementarrays.Dies wird vom Upgrade-Assistenten verwendet, um die aktuellen VB6-Steuerungsarrays zu ersetzen.

Ein Kontrollarray in VB6 ist jedoch nur eine Sammlung von Objekten, wobei VB6 an der Oberfläche etwas Syntaxmagie vollbringt.In der .NET-Welt erzwingen sie durch die Entfernung dieses Problems bessere Vorgehensweisen.

Abschließend lässt sich sagen, dass Sie mit dem Aufkommen von Generika nichts mehr davon abhalten können, sie zu verwenden

List<YourControl> MyControlArray.

Erstellen Sie eine Reihe von Steuerelementen.

TextBox[] textboxes = new TextBox[] {
    textBox1,
    textBox2,
    textBox3
};

Das gleiche Klickereignis kann die Tastendrücke mehrerer Tasten in .Net verarbeiten.Sie könnten dann das zu findende Textfeld in der Tag-Eigenschaft hinzufügen?

Private Sub AllButton_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
  Dim c As Control = CType(sender, Control)
  Dim t As TextBox = FindControl(CType(c.Tag, String))
  If t Is Not Nothing Then
     t.Text = "Clicked"
  End If
End Sub

Die beiden Hauptvorteile von Kontrollarrays in VB6 waren:(1) Sie haben Ihnen eine Möglichkeit gegeben, durch eine Sammlung von Kontrollen zu iterieren (2) Sie ermöglichten Ihnen, Ereignisse zwischen den Kontrollen zu teilen

(1) kann in .NET unter Verwendung eines Arrays von Steuerelementen erreicht werden (2) durch ein Ereignis mehrere Steuerelemente (die Syntax ist etwas anders, da Sie die verwenden sender Argument statt myArray(index)).

Eine schöne Sache an .Net ist, dass diese Funktionen entkoppelt sind.So können Sie beispielsweise über Steuerelemente verfügen, die Ereignisse gemeinsam nutzen, auch wenn sie nicht Teil eines Arrays sind und unterschiedliche Namen und sogar einen anderen Typ haben.Und Sie können eine Sammlung von Steuerelementen durchlaufen, selbst wenn diese völlig unterschiedliche Ereignisse haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top