Domanda

Forse semplicemente non conosco ancora .NET abbastanza bene, ma devo ancora vedere un modo soddisfacente per implementare facilmente questo semplice codice VB6 in .NET (supponiamo che questo codice sia su un modulo con N CommandButtons nell'array Command1() e N Caselle di testo nell'array Text1()):

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

So che non è un codice molto utile, ma dimostra la facilità con cui è possibile utilizzare gli array di controlli in VB6.Qual è l'equivalente più semplice in C# o VB.NET?

È stato utile?

Soluzione

Crea un elenco generico di caselle di testo:

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

Altri suggerimenti

Un'altra cosa interessante di VB .NET è avere un singolo gestore di eventi che gestisce più controlli:

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

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub

Non c'è vero Analogico 1 a 1 in .Net.Certo, puoi creare array o elenchi di controlli di un tipo specifico, ma non c'è nulla che lo faccia automaticamente.

Tuttavia, non ho mai visto un array di controlli che non potesse essere sottoposto a refactoring in .Net in qualcosa Meglio.Un esempio calzante è il tuo esempio.Nello scenario che hai pubblicato, stai utilizzando gli array di controlli per associare un pulsante a una casella di testo.In .Net, probabilmente lo faresti con un controllo personalizzato.Il controllo personalizzato consisterebbe in un pulsante, una casella di testo e forse un timer condiviso/statico.Il modulo utilizza diverse istanze di questo controllo personalizzato.Implementi la logica necessaria per il controllo una volta ed è isolato nel proprio file sorgente che può essere tracciato e modificato nel controllo del codice sorgente senza richiedere un'unione con la classe del modulo più grande o facilmente riutilizzabile su più moduli o anche in più progetti .Inoltre, non devi preoccuparti di assicurarti che l'indice del pulsante di comando corrisponda all'indice della casella di testo.

L'uso di un controllo personalizzato per questo invece di un array di controlli è vagamente analogo all'uso di una classe per raggruppare dati invece di un array, in quanto ottieni nomi invece di indici.

Ci sono due aspetti.

.NET supporta prontamente array di controlli, VB6 ha dovuto semplicemente utilizzare una soluzione alternativa perché altrimenti il ​​collegamento degli eventi sarebbe stato davvero difficile.In .NET, il collegamento dinamico degli eventi è semplice.

Tuttavia, la progettazione di moduli .NET non supporta gli array di controlli per un semplice motivo:matrici di controlli vengono create/estese in fase di esecuzione.Se sai di quanti controlli hai bisogno in fase di compilazione (il ragionamento va avanti), dai loro nomi diversi e non inserirli in un array.

So che non è un codice molto utile

Questo è esattamente il punto.Perché avere una funzionalità se è inutile?

Se necessario, puoi anche accedere a un controllo per nome, ottenendo qualcosa del genere:

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 libreria di compatibilità di VisualBasic .NET contiene array di controlli con tipizzazione forte.Questo è ciò che la procedura guidata di aggiornamento utilizza per sostituire gli attuali array di controlli VB6.

Tuttavia, un array di controlli in VB6 è solo una raccolta di oggetti con VB6 che esegue alcune magie di sintassi in superficie.Nel mondo .NET, rimuovendolo, stanno imponendo pratiche migliori.

In conclusione, con l'avvento dei generici, non c'è nulla che ti impedisca di usarli

List<YourControl> MyControlArray.

Crea una serie di controlli.

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

Lo stesso evento clic può gestire la pressione dei pulsanti da più pulsanti in .Net.Potresti quindi aggiungere la casella di testo da trovare nella proprietà 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

I due vantaggi principali degli array di controllo in VB6 erano:(1) Ti hanno fornito un modo per iterare attraverso una raccolta di controlli (2) ti hanno permesso di condividere eventi tra i controlli

(1) può essere realizzato in .NET utilizzando un array di controlli (2) può essere realizzato facendo in modo che un evento gestisca più controlli (la sintassi è un po 'diversa perché si utilizza il sender argomento invece di myArray(index)).

Una cosa bella di .Net è che queste funzionalità sono disaccoppiate.Quindi, ad esempio, puoi avere controlli che condividono eventi anche se non fanno parte di un array e hanno nomi diversi e persino un tipo diverso.E puoi scorrere una raccolta di controlli anche se hanno eventi totalmente diversi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top