Question

Peut-être que je ne connais pas encore assez bien .NET, mais je n'ai pas encore trouvé de moyen satisfaisant d'implémenter facilement ce code VB6 simple dans .NET (en supposant que ce code se trouve sur un formulaire avec N CommandButtons dans le tableau Command1() et N TextBoxes dans le tableau Text1() :

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

Je sais que ce n'est pas un code très utile, mais cela démontre la facilité avec laquelle les tableaux de contrôle peuvent être utilisés dans VB6.Quel est l’équivalent le plus simple en C# ou VB.NET ?

Était-ce utile?

La solution

Faites une liste générique de zones de texte :

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;
}

Autres conseils

Une autre chose intéressante que fait VB .NET est d'avoir un seul gestionnaire d'événements qui gère plusieurs contrôles :

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

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub

Il n'y a pas réel 1 à 1 analogique en .Net.Bien sûr, vous pouvez créer des tableaux ou des listes de contrôles d’un type spécifique, mais rien ne le fera automatiquement pour vous.

Cependant, je n'ai jamais vu de tableau de contrôle qui ne pouvait pas être refactorisé dans .Net en quelque chose mieux.Un bon exemple est votre exemple.Dans le scénario que vous avez publié, vous utilisez des tableaux de contrôle pour associer un bouton à une zone de texte.Dans .Net, vous feriez probablement cela avec un contrôle personnalisé.Le contrôle personnalisé consisterait en un bouton, une zone de texte et peut-être une minuterie partagée/statique.Le formulaire utilise plusieurs instances de ce contrôle personnalisé.Vous implémentez la logique nécessaire au contrôle une seule fois, et il est isolé dans son propre fichier source qui peut être suivi et modifié dans le contrôle de source sans nécessiter de fusion avec la classe de formulaire plus grande, ou facilement réutilisé sur plusieurs formulaires ou même dans plusieurs projets. .Vous n'avez pas non plus à vous soucier de vous assurer que l'index du bouton de commande correspond à l'index de la zone de texte.

Utiliser un contrôle personnalisé pour cela au lieu d'un tableau de contrôle est vaguement analogue à l'utilisation d'une classe pour regrouper des données au lieu d'un tableau, dans la mesure où vous obtenez des noms au lieu d'index.

Il y a deux aspects.

.NET prend facilement en charge les tableaux de contrôles, VB6 a simplement dû utiliser une solution de contournement, car sinon, le câblage des événements était très difficile.Dans .NET, le câblage dynamique des événements est simple.

Cependant, le concepteur de formulaires .NET ne prend pas en charge les tableaux de contrôles pour une raison simple :des tableaux de contrôles sont créés/étendus au moment de l’exécution.Si vous savez de combien de contrôles vous avez besoin au moment de la compilation (le raisonnement est valable), vous leur donnez des noms différents et ne les placez pas dans un tableau.

Je sais que ce n'est pas un code très utile

C'est exactement le point.Pourquoi avoir une fonctionnalité si elle ne sert à rien ?

Si nécessaire, vous pouvez également accéder à un contrôle par son nom, ce qui donne quelque chose comme ceci :

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

La bibliothèque de compatibilité de VisualBasic .NET contient des tableaux de contrôles fortement typés.C'est ce que l'assistant de mise à niveau utilise pour remplacer les matrices de contrôle VB6 actuelles.

Cependant, un tableau de contrôle dans VB6 n'est qu'une collection d'objets avec VB6 faisant de la magie syntaxique en surface.Dans le monde .NET, en supprimant cela, ils imposent de meilleures pratiques.

En conclusion, avec l’avènement des génériques, rien ne vous empêche d’utiliser

List<YourControl> MyControlArray.

Créez un tableau de contrôles.

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

Le même événement de clic peut gérer les pressions sur plusieurs boutons dans .Net.Vous pourriez ensuite ajouter la zone de texte à rechercher dans la propriété Tag ?

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

Les deux principaux avantages des tableaux de contrôle dans VB6 étaient :(1) Ils vous ont fourni un moyen de parcourir une collection de contrôles (2) Ils vous ont permis de partager des événements entre les contrôles

(1) peut être accompli en .NET en utilisant un tableau de commandes (2) peut être accompli en ayant un événement gérant plusieurs commandes (la syntaxe est un peu différente car vous utilisez le sender argument au lieu de myArray(index)).

Un avantage de .Net est que ces fonctionnalités sont découplées.Ainsi, par exemple, vous pouvez avoir des contrôles qui partagent des événements même s'ils ne font pas partie d'un tableau et ont des noms différents et même un type différent.Et vous pouvez parcourir une collection de contrôles même s’ils ont des événements totalement différents.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top