Pregunta

Tal vez simplemente no conozco .NET lo suficientemente bien todavía, pero todavía tengo que ver una forma satisfactoria de implementar fácilmente este código VB6 simple en .NET (supongamos que este código está en un formulario con N CommandButtons en la matriz Command1() y N Cuadros de texto en la matriz Texto1()):

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

Sé que no es un código muy útil, pero demuestra la facilidad con la que se pueden utilizar los arreglos de control en VB6.¿Cuál es el equivalente más simple en C# o VB.NET?

¿Fue útil?

Solución

Haga una lista genérica de cuadros de texto:

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

Otros consejos

Otra cosa interesante que hace VB .NET es tener un único controlador de eventos que maneja múltiples controles:

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

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub

No hay real 1 a 1 analógico en .Net.Claro, puedes crear matrices o listas de controles de un tipo específico, pero no hay nada que lo haga automáticamente.

Sin embargo, nunca he visto una matriz de control que no pueda refactorizarse en .Net a algo mejor.Un buen ejemplo es su ejemplo.En el escenario que publicaste, estás usando matrices de control para emparejar un botón con un cuadro de texto.En .Net, probablemente harías esto con un control personalizado.El control personalizado consistiría en un botón, un cuadro de texto y tal vez un temporizador compartido/estático.El formulario utiliza varias instancias de este control personalizado.La lógica necesaria para el control se implementa una vez y se aísla en su propio archivo fuente, que puede rastrearse y editarse en el control de fuente sin necesidad de fusionarse con la clase de formulario más grande, o reutilizarse fácilmente en múltiples formularios o incluso en múltiples proyectos. .Tampoco tiene que preocuparse por asegurarse de que el índice del botón de comando coincida con el índice del cuadro de texto.

Usar un control personalizado para esto en lugar de una matriz de control es vagamente análogo a usar una clase para agrupar datos en lugar de una matriz, en el sentido de que obtienes nombres en lugar de índices.

Hay dos aspectos.

.NET admite fácilmente conjuntos de controles, VB6 solo tuvo que usar una solución alternativa porque, de lo contrario, conectar eventos era realmente difícil.En .NET, conectar eventos dinámicamente es fácil.

Sin embargo, el diseñador de formularios .NET no admite matrices de control por una sencilla razón:Las matrices de controles se crean/extienden en tiempo de ejecución.Si sabe cuántos controles necesita en el momento de la compilación (según el razonamiento), entonces les da nombres diferentes y no los coloca en una matriz.

Sé que no es un código muy útil.

Ese es exactamente el punto.¿Por qué tener una función si es inútil?

Si es necesario, también puedes acceder a un control por nombre, lo que da como resultado algo como esto:

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 biblioteca de compatibilidad de VisualBasic .NET contiene matrices de control con tipos fuertes.Esto es lo que utiliza el asistente de actualización para reemplazar los arreglos de control VB6 actuales.

Sin embargo, una matriz de control en VB6 es solo una colección de objetos con VB6 haciendo algo de magia sintáctica en la superficie.En el mundo .NET, al eliminar esto, están imponiendo mejores prácticas.

Para terminar, con la llegada de los genéricos, no hay nada que le impida utilizar

List<YourControl> MyControlArray.

Haz una serie de controles.

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

El mismo evento de clic puede manejar las pulsaciones de botones desde varios botones en .Net.¿Podría entonces agregar el cuadro de texto para buscar en la propiedad Etiqueta?

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

Los dos beneficios principales de los arreglos de control en VB6 fueron:(1) Le proporcionaron una forma de iterar a través de una colección de controles (2) le permitieron compartir eventos entre los controles

(1) se puede lograr en .NET utilizando una matriz de controles (2) se puede lograr haciendo que un evento maneje múltiples controles (la sintaxis es un poco diferente porque usa el sender argumento en lugar de myArray(index)).

Una cosa buena de .Net es que estas funciones están desacopladas.Entonces, por ejemplo, puede tener controles que compartan eventos incluso si no son parte de una matriz y tienen nombres diferentes e incluso un tipo diferente.Y puede iterar a través de una colección de controles incluso si tienen eventos totalmente diferentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top