2008-09-02 12 views
8

Quizás todavía no conozco .NET bastante bien, pero aún no he visto una manera satisfactoria de implementar este sencillo código VB6 fácilmente en .NET (suponiendo que este código está en un formulario con N CommandButtons en la matriz Command1() y N cuadros de texto en la matriz Texto1()):¿Cuál es el equivalente .NET más simple de una matriz de control VB6?

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 controlan las matrices se pueden utilizar en VB6. ¿Cuál es el equivalente más simple en C# o VB.NET?

+0

Vea también http://stackoverflow.com/questions/5497403/control-array-in-vb-net y http://stackoverflow.com/questions/5738092/vb6-control-arrays-in-net – MarkJ

+0

Tal vez podría consultar en el futuro mi idea: http://stackoverflow.com/questions/5738092/vb6-control-arrays-in-net/42627033#42627033, creo que proporciona una solución a esta pregunta difícil. –

Respuesta

5

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

Haz una serie de controles.

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

Otra cosa buena que VB .NET hace es tener un solo controlador de eventos que maneja múltiples controles: biblioteca de compatibilidad de

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

     TextBox2.TextChanged, _ 

     TextBox3.TextChanged 

End Sub 
1

VisualBasic .NET contiene fuertes matrices de control con tipo. 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 simplemente 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.

En el cierre, con la llegada de los genéricos, no hay nada que nos impida el uso de

List<YourControl> MyControlArray. 
2

Hay dos aspectos.

.NET admite fácilmente matrices de controles, VB6 solo 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.

Yo sé que no es un código muy útil

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

Si es necesario, también se puede acceder a un control por su nombre, lo que resulta en 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 
+0

Me refería a mi ejemplo cuando dije: "no es un código muy útil". He encontrado que las matrices de control son extremadamente útiles en VB6, por lo que planteé la pregunta. Encontré su solución propuesta bastante inteligente, pero parece un poco difícil. – raven

0

El mismo evento click se puede manejar la botón presiona desde múltiples 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 
3

No hay verdadera 1 a 1 analógica 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 se haya podido refactorizar.Neto 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 fusió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.

0

Las dos ventajas principales de matrices de control en Visual Basic 6 fueron: (1) proporcionan un camino para iterar a través de una colección de controles (2) Permitieron a compartir eventos entre controles

(1) se puede lograr en .Net usando una matriz de controles (2) se puede lograr haciendo que un evento maneje varios controles (la sintaxis es un poco diferente porque usa el argumento 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.

Cuestiones relacionadas