MacroSustitución

02/06/2005 - 11:25 por JuanilloFox | Informe spam
Hola grupo,

Tengo el siguiente problema a la hora de implementar lo que en Visual Foxpro
se llama MacroSustitución y la verdad no se como implementarlo en C#.

En principio tengo una serie de TexBox que forman una matriz.

txtC1T1 , txtC1T2, ... , txtC2T1, txtC2T2, ..., txtCnTm.

la idea es crear un bucle para hacer referencia a cada uno de ellos.

string cTexBox = "";
string ci = "";
string cj = "";
for (int i = 1 ; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
ci = Convert.ToString(i);
cj = Convert.ToString(j);
cTexBox = "txtC" + ci + "T" + cj;
&cTexBox = "Este es el TexBox" + ci + "," + cj; // Esto sería en
FoxPro
(&cTexBox.Text. ¿Cómo se realizaría
en C#?
}
}

Gracias
Un saludo

juanillofox@andujar.com

Preguntas similare

Leer las respuestas

#1 Braulio Diez
02/06/2005 - 12:43 | Informe spam
Hola Juanillo,

Lo que he visto con los controles, es que tu puedes acceder al array de
controles de la ventana y ver el nombre de cada control, una opción es
recorrer los controles y ir cogiendo cada control, he encontrado está función
que hace un "FindControl" (es Vb pero se podría pasar facilmente a C#):

Private Function FindControl(ByVal name_ctrl As String, ByVal control As
Control)
Dim
ctrl
As

control
For Each ctrl In control.Controls
If (StrComp(ctrl.Name, name_ctrl, vbTextCompare) = 0) Then
Return ctrl
Exit Function
ElseIf ctrl.HasChildren Then
Return FindControl(name_ctrl, ctrl)
End If
Next
End Function

Así tu función quedaría como:

for (int j = 1; j <= m; j++)
{
ci = Convert.ToString(i);
cj = Convert.ToString(j);
cTexBox = "txtC" + ci + "T" + cj;


TextBox ControlActual;
FindControl(cTextBox, (Control) ControlActual);

Se podría optimizar para no dar pasadas de más, pero creo que no es tan
grave como está ya que en una ventana no suelen haber más de 30 controles, es
más, no se yo si FoxPro internamente funcionará así :-).

Saludos
Braulio

"JuanilloFox" escribió:

Hola grupo,

Tengo el siguiente problema a la hora de implementar lo que en Visual Foxpro
se llama MacroSustitución y la verdad no se como implementarlo en C#.

En principio tengo una serie de TexBox que forman una matriz.

txtC1T1 , txtC1T2, ... , txtC2T1, txtC2T2, ..., txtCnTm.

la idea es crear un bucle para hacer referencia a cada uno de ellos.

string cTexBox = "";
string ci = "";
string cj = "";
for (int i = 1 ; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
ci = Convert.ToString(i);
cj = Convert.ToString(j);
cTexBox = "txtC" + ci + "T" + cj;
&cTexBox = "Este es el TexBox" + ci + "," + cj; // Esto sería en
FoxPro
(&cTexBox.Text. ¿Cómo se realizaría
en C#?
}
}

Gracias
Un saludo





Respuesta Responder a este mensaje
#2 JuanilloFox
02/06/2005 - 13:22 | Informe spam
Hola Braulio,

Gracias por responder

Has implementado el poder encontrar un control en el conjunto de controles.
Bien pero el problemas es ¿cómo hago referencia a dicho control para que en
su propiedad Text, por ejemplo, pueda introducirle un valor. No se si queda
clara la cuestión.

Piensa que tengo una matriz de 15 x 15 TextBox, y la referencia a cada uno
de ellos para introducirle un valor o recoger su valor sería tediosa.

Gracias
Un saludo


Respuesta Responder a este mensaje
#3 Braulio Diez
02/06/2005 - 16:09 | Informe spam
Hola,

Mmm... no se si he entendido bien lo que quieres hacer, lo que piense que
es: Tienes una serie de cajas de edición, que has nombrado de la 1 a la 15
(por ejemplo), algo así como: miCaja1, miCaja2 miCaja15. Quieres cambiar
la propiedad texto en todas (por ejemplo a un valor por defecto), para ello
en foxpro lo hacías con un bucle y ibas cambiando la propiedad text de cada
control, en C# lo que podrías hacer es:

for (int j = 1; j <= m; j++)
{
ci = Convert.ToString(i);
cj = Convert.ToString(j);
cTexBox = "txtC" + ci + "T" + cj;
TextBox ControlActual;
FindControl(cTextBox, (Control) ControlActual);
ControlActual.Text = "MiTextoPorDefecto";

En cuanto a rapidez, para 30 controles, yo no creo que sea demasiado lento
(ten en cuenta que son operaciones echas en memoria), ya te digo, que pienso
que FoxPro internmanete puede hacer algo parecido.

Si lo quieres hacer más optimo, una cosa que puedes hacer es crearte un
ArrayList o Lista de controles e ir añadiendo referencias a los controles que
quieres cambiar, así sólo tendrías que recorrer esa lista cada vez que
quisieras poner valores a esos controles y no preocuparte de como están
nombrados.

Un saludo
Braulio




"JuanilloFox" wrote:

Hola Braulio,

Gracias por responder

Has implementado el poder encontrar un control en el conjunto de controles.
Bien pero el problemas es ¿cómo hago referencia a dicho control para que en
su propiedad Text, por ejemplo, pueda introducirle un valor. No se si queda
clara la cuestión.

Piensa que tengo una matriz de 15 x 15 TextBox, y la referencia a cada uno
de ellos para introducirle un valor o recoger su valor sería tediosa.

Gracias
Un saludo







Respuesta Responder a este mensaje
#4 JuanilloFox
02/06/2005 - 17:37 | Informe spam
Hola Braulio

No entiendo muy bien tu planteamiento de sentencia...

TextBox ControlActual;
FindControl(cTextBox, (Control) ControlActual);
ControlActual.Text = "MiTextoPorDefecto";



Ya que con FindControl lo que harías es encontral el control nombrado en
cTexBox, pero aquí parece que le asignas un segundo parámetro como
referencia. He mirado la ayuda y no aparece nada al respecto. Sólo viene un
único parámetro que es el nombre de control a buscar.

Si puedes aclararlo, o tal vez te has confundido?


Gracias
Un saludo


Respuesta Responder a este mensaje
#5 Tristan
02/06/2005 - 19:00 | Informe spam
En realidad tu problema tiene muchas soluciones:

Yo creo que la forma más fácil, es plantear las cosas de otra manera. No
solo acceder a los controles en un bucle, sino incluso crearlos desde el
principio en un bucle, y mantenerlos en un array bidimensional:

Por ejemplo con esto creas un array de controles de 4x3:

const int filas = 4;
const int columnas = 3;
TextBox[,] textos = new TextBox[filas, columnas];

TextBox texto;
for (int i = 0; i < filas; i++)
for (int j = 0; j < columnas; j++)
{
texto = new TextBox();
texto.Location = new Point(j * texto.Width, i * texto.Height);
texto.Text = String.Format("Textos({0},{1})", i, j);
this.Controls.Add(texto);
textos[i, j] = texto;
}

En cualquier momento puedes acceder al array textos, y recorrerlo con un
bucle.

Si necesitas que las dimensiones sean dinámicas, puedes utilizar ArrayList,
o cualquier otra colección. También puedes utilizar un Hashtable para acceder
por clave.

Tratar los eventos del array es muy sencillo. Solo tienes que asignar los
delegados de evento en el propio bucle.


Si no quieres crear los controles en un bucle, sino que quieres utilizar los
controles generados por el diseñador, puedes asignarlos manualmente como
elementos del array al declarar el array.

TextBox textos = {{TxtC1T1, TxtC1T2, ...}, {TxtC2T1, ...}...}

Otra forma es utilizar lo que te ha dicho Braulio para asignar los elementos
al array. Una vez asignados, trabaja siempre con el array.

Otra forma, la más parecida a la de la macrosustitución sería utilizar
reflection para obtener el campo del control por su nombre. Este método:

private object getField(string name)
{
return this.GetType().GetField(name,
BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this);
}

Te permitirá localizar los controles por nombre:

TextBox texto = getField("TxtT1C1") as TextBox;

Espero que todo esto te sirva de ayuda.

Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida