tipos - ¿Cuál es el equivalente.NET más simple de una matriz de control VB6?
tag c# (8)
El mismo evento de clic puede manejar las pulsaciones de botones desde varios botones en .Net. ¿Podría 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
Tal vez aún no conozco .NET bastante bien, pero aún no he visto una forma satisfactoria de implementar este código VB6 simple fácilmente en .NET (suponiendo que este código está en un formulario con N CommandButtons en la matriz Command1 () y N TextBoxes en la matriz Text1 ()):
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 las matrices de control se pueden usar en VB6. ¿Cuál es el equivalente más simple en C # o VB.NET?
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;
}
Hay dos aspectos.
.NET admite fácilmente matrices de controles, VB6 simplemente tuvo que usar una solución porque de lo contrario, el cableado de eventos fue realmente difícil. En .NET, cablear eventos dinámicamente es fácil.
Sin embargo, el diseñador de formularios .NET no admite matrices de control por una simple razón: las matrices de controles se crean / amplían en tiempo de ejecución. Si sabe cuántos controles necesita en tiempo de compilación (el razonamiento es correcto), entonces le da diferentes nombres y no los pone 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 puede 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
Haz una serie de controles.
TextBox[] textboxes = new TextBox[] {
textBox1,
textBox2,
textBox3
};
La biblioteca de compatibilidad de VisualBasic .NET contiene fuertes matrices de control tipadas. Esto es lo que usa el asistente de actualización para reemplazar las matrices de control de VB6 actuales.
Sin embargo, una matriz de control en VB6 es solo una colección de objetos con VB6 haciendo algo de magia de sintaxis en la superficie. En el mundo .NET, al eliminar esto, están forzando mejores prácticas.
Para terminar, con el advenimiento de los genéricos, no hay nada que te impida usar
List<YourControl> MyControlArray.
Los dos beneficios principales de las matrices de control en VB6 fueron: (1) Proporcionaron una forma de iterar a través de una colección de controles (2). Le permitieron compartir eventos entre controles.
(1) se puede lograr en .Net usando una matriz de controles (2) se puede lograr haciendo que un evento controle varios controles (la sintaxis es un poco diferente porque usa el argumento del sender
en lugar de myArray(index)
).
Una cosa buena de .Net es que estas características están desacopladas. Entonces, por ejemplo, puede tener controles que compartan eventos incluso si no son parte de una matriz y tienen diferentes nombres e incluso un tipo diferente. Y puede iterar a través de una colección de controles, incluso si tienen eventos totalmente diferentes.
No hay un verdadero 1 a 1 análogo en .Net. Claro, puedes hacer arreglos o listas de controles de un tipo específico, pero no hay nada que haga eso automáticamente.
Sin embargo, nunca he visto una matriz de control que no pudiera ser refactorizada en .Net a algo mejor . Un ejemplo es tu ejemplo. En el escenario que publicó, está utilizando matrices de control para vincular un botón con un cuadro de texto. En .Net, probablemente haría 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 usa varias instancias de este control personalizado. Implementa la lógica necesaria para el control una vez y está aislada de su propio archivo fuente que puede rastrearse y editarse en el control de origen sin requerir una combinación 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 análogo al uso de datos de clase a grupo en lugar de una matriz, en la que se obtienen nombres en lugar de índices.
Otra cosa agradable que VB .NET hace 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