2010-08-11 35 views
5

No estoy seguro de cuál es la mejor manera de decir esto, pero me pregunto si se puede hacer un acceso dinámico al nombre de variable en C# (3.5).Nombre de variable dinámica Usar en C# para WinForms

Aquí está el código que estoy buscando actualmente para "mejorar" o hacer más elegante con un bucle.

private void frmFilter_Load(object sender, EventArgs e) 
    { 
     chkCategory1.Text = categories[0]; 
     chkCategory2.Text = categories[1]; 
     chkCategory3.Text = categories[2]; 
     chkCategory4.Text = categories[3]; 
     chkCategory5.Text = categories[4]; 
     chkCategory6.Text = categories[5]; 
     chkCategory7.Text = categories[6]; 
     chkCategory8.Text = categories[7]; 
     chkCategory9.Text = categories[8]; 
     chkCategory10.Text = categories[9]; 
     chkCategory11.Text = categories[10]; 
     chkCategory12.Text = categories[11]; 


    } 

¿Hay una manera de hacer algo como ("chkCategory" + i.ToString()). Texto?

+0

Es posible que demuestre completamente mi desconocimiento de la parte dinámica de las nuevas características C#, pero pensé que C# era un lenguaje compilado. Por lo tanto, para lograr esto, debería crear una instancia del compilador, generar el código y luego ejecutar el código dentro del contexto de la propiedad de los controles. No es práctico. –

+0

Pregunta general en respuesta a las respuestas: cuando se utiliza el diseñador de WinForms, ¿cuál es el mejor método para manejar la matriz de casillas de verificación? – Awaken

+0

Para qué se inventó el reflejo (en su caso especial, también puede acceder al control por sus nombres). – codymanix

Respuesta

5
for(...) 
{ 
    CheckBox c = this.Controls["chkCategory" + i.ToString()] as CheckBox ; 

    c.Text = categories[i]; 
} 
+0

Perfecto. Trabajado como un encanto. – Awaken

0

No necesita dinámica para eso. Coloque chkCategory1 - 12 en una matriz, y repáselo con un ciclo for. Sugeriría que lo mantengas en un campo e inicialices al momento de la construcción del formulario, porque chkCategory parece estar relacionado. Pero si quieres un ejemplo sencillo de cómo hacerlo en ese método simple, entonces sería algo como esto:

private void frmFilter_Load(object sender, EventArgs e) 
{ 
    var chkCategories = new [] { chkCategory1, chkCategory2, chkCategory3, .......... }; 
    for(int i = 0 ; i < chkCategories.Length ; i++) 
     chkCategoies[i].Text = categories[i]; 
} 

usted sabe más acerca de la aplicación, por lo que quizá podría evitar escribir todos los nombres de los controles - por ejemplo, si se colocan en un control principal común, entonces usted puede encontrarlos yendo a través de sus hijos.

+0

No creo que el OP signifique 'dynamic' dinámico. –

+0

¿Cómo funciona esto con el diseñador de WinForms? ¿Tendría que definir manualmente todas las ubicaciones y propiedades en el código? – Awaken

0

No, pero se podría hacer algo como esto (no probado, Cuidado con los errores de sintaxis):

private readonly CheckBox[] allMyCheckboxes = new CheckBox[] { chkCategory1, chkCategory2, ... } 

continuación, sólo tiene que hacer

for (i = 0; i < 12; i++) allMyCheckboxes[i].Text = categories[i]; 
6

Sí, puede utilizar

Control c = this.Controls.Find("chkCategory" + i.ToString(), true).Single(); 
    (c as textBox).Text = ...; 

Agregue algunos errores y envuélvalos en un método agradable (de extensión).


Editar: Devuelve Control[] así que o una [0] o una .Single() son necesarios al final. Adicional.

+0

¡Agradable! Estoy corregido de mi comentario como queda en la pregunta. –

+0

@faux trot, esta es una característica de la biblioteca, no el idioma. No es realmente el identificador en el que estamos buscando, sino la propiedad Nombre. Los 2 se mantienen sincronizados. –

+0

Gracias. Esta es una técnica con la que no estaba familiarizado, pero tengo un par de situaciones en las que será agradable. – Awaken

2

Puede hacerlo con la reflexión. Pero no lo hagas

Es más apropiado crear una lista de controles, agregarlos programáticamente a su formulario e indexarlos.

1

A veces puede ayudar a poner los controles en una matriz o una colección como tal:

Checkbox[] chkCataegories = new Checkbox[] { chkCategory1, chkCategory2 ... }; 
for(int i = 0; i < chkCategories.Length; i++) 
    chkCategories[i].Text = categories[i]; 

Como otro enfoque, puede crear dinámicamente las casillas de verificación en tiempo de ejecución en lugar de tiempo de diseño:

for(int i = 0; i < categories.Length; i++) 
{ 
    Checkbox chkCategory = new chkCategory { Text = categories[i] }; 
    someContainer.Controls.Add(chkCategory); 
} 

Al menos con controles creados dinámicamente, no necesita modificar su GUI o su código de formulario cada vez que agregue nuevas categorías.

+0

¿Hay una buena manera de hacerlo con el diseñador de WinForms en VS? ¿O tendría que abandonar el diseñador y compilar el formulario con código de forma dinámica en Load? – Awaken

0

El "this.Controls [" chkCategory "+ i.ToString()]" y "this.Controls.Find (" chkCategory "+ i.ToString(), true)" ambos no funcionan ... el former le informa que los contenidos de [] no son un int y el último que ControlCollection no contiene una definición para Find.

Use "Control myControl1 = FindControl (" TextBox2 ");" en lugar.

Necesitaba este formulario ya que estaba recorriendo otro conjunto, extrayendo valores y utilizándolos para rellenar campos de formulario. Es mucho más fácil buscar etiquetas1, etiquetas2, etiquetas3, etc.

Cuestiones relacionadas