Crear controles en tiempo de ejecución y otra duda[c#]

Hablo de C# en concreto.

Lo que pretendo hacer os lo expongo con un ejemplo para que lo entendáis:

Tengo un textbox y un botón, pues cuando introduzcas un número en un textbox (supongamos que introducimos un 5), le das al botón y se te crean 5 etiqutas (labels) en el formulario.

He estado intentandolo, pero es que no puedo ponerle nombres distintos a los labels a la hora de crearlos...

¿Cómo se puede hacer algo así?
¿Alguna idea?
Puedes poner ese texto como variable? Si lo puedes hacer haz una matriz en la que esa variable (el 5, sea el numero de filas).
No se me ocurre nada mas especifico, hace muchos años que deje el C xD
Lo de extraer el 5 como variable lo tienes aqui: http://www.forosdelweb.com/f14/extraer-valor-textbox-traves-variable-control-229351/
Que va, ese texto no me deja ponerlo como variable. Es lo primero que pensé, poner que el nombre de las labels fuese un string, que fuese desde el 1 hasta "n", donde n sería el número que hubiera en el textbox.

Viendo que esto no se puede hacer así, no se me ocurre otra forma....

A ver si van saliendo más sugerencias.

Gracias por responder.

PD: ¿No hay ningún hilo oficial de programación?
A ver, por partes, en primer lugar necesitas un modo de crear dinámicamente las "labels". Luego para cada una tendrás que inicializarla con su texto y posición.

En el evento click del boton, entras en un bucle tal que:

// posicion inicial de la primera etiqueta en el formulario (depende de tu diseño)
int baseX = 40;
int baseY = 30;
// creamos el array
for (int i = 0; i < labelCount; i++)
{
    // crea el componente para ese elemento del array
    System.Windows.Forms.Label l = new System.Windows.Forms.Label();
    // la posiciona (una encima de otra)
    l.Location = new Point(baseX, baseY + (10 * y));
    l.Text = "Texto de la etiqueta " + i.ToString();
    // agrega al array de controles de la ventana la etiqueta actual
    this.Controls.Add(l);
}


Está escrito de memoria, no aseguro que "compile" pero supongo que te valdrá como pseudo-código...
Probaré ese código que me has dado cuando tenga el Visual Studio a mano. :)

EDIT: Acabo de probar el código que me has puesto; y me sigue dando el problema que me da desde un principio, y es que sólo se crea un label. Es decir, que cada vez que entra en el for, sobreescribe la instancia del label llamada "l", y sólo me aparece una, por más que entre en el for. Creo que hay que encontrar una forma de ir cambiándole el nombre, que no siempre se llame "l"...
Seguiré intentándolo porque tiene que haber forma. Espero vuestra ayuda también.

Tengo otra duda referente a programas del c# (bueno y programas en general creados por usuarios como nosotros). He hecho un programa que le quiero pasar a un amigo, pero quiero que sólo lo pueda usar él, me explico: No quiero que él le pueda pasar mi programa a otras personas y éstas lo puedan usar. ¿Cómo podría hacer algo así?
Lo acabo de probar y funciona... tu problema probablemente sea tamaño y posicionamiento de las etiquetas. Contaba con que hicieras tú mismo los ajustes a mano de las posiciones y tamaños ya que el código era un simple ejemplo escrito de memoria para que pillaras la idea, pero bueno... ahí te van los cambios para que se vean bien con el ejemplo (mi formulario es de 300x300px y tiene un textbox y un boton en la parte de arriba... en función de esto, tu baseX y baseY del ejemplo anterior pueden variar...)

El contenido del bucle sería:

                    // crea el componente para ese elemento del array
                    System.Windows.Forms.Label l = new System.Windows.Forms.Label();
                    // la posiciona (una encima de otra)
                    l.Location = new Point(baseX, baseY + (12 * i));
                    l.Text = "Texto de la etiqueta " + i.ToString();
                    l.Width = 200;
                    l.Height = 12;
                    // agrega al array de controles de la ventana la etiqueta actual
                    this.Controls.Add(l);


Sobre lo que comentas de instancias que se sobreescriben no ocurre de tal manera. Se crean por cada vuelta del bucle y al salir de esa vuelta se destruyen.... ese es su ámbito. Son instancias totalmente diferentes, que además se pasan al metodo Add() de la colección de controles de la ventana...
Ahora si que me sale. Pero lo extraño es que no era por el tamaño del formulario por lo que no salía antes. Es por las instrucciones:

l.Width = 200;
l.Height = 12;


He probado primero sin poner eso, y teniendo el formulario bien grande, y sólo me sale la etiqueta número 1.
Y cuando le añado esas dos instrucciones sale perfectamente el número de labels que haya puesto en el textbox.
Si no me equivoco esas dos instrucciones son el ancho y el largo de las labels. ¿Por qué no salen si no le pongo eso y sólo sale una?
Es que es raro que sólo salga la primera...

Y ahora, una vez hecho esto...¿Cómo accedo a cada Label si le quiero modificar el texto o cualquier otra cosa?

Bueno muchas gracias por tomarte la molestia y por tu ayuda.
Como te decía antes, si que se estaban creando, tu problema era visual, ya que debido a su tamaño y posición por defecto, se estaban "solapando". Tu mismo puedes hacer la prueba, desde el editor de formularios en diseño, de arrastrar un componente y luego arrastrar otro justo encima ya verás como el solapamiento hace que uno oculte al otro.

Respecto a como acceder a cada una de ellas, lo más facil sería almacenar en el nombre de cada etiqueta un identificador único que te permita localizarla a posteriori recorriendote los controles del formulario filtrandolos por aquellos que sean etiquetas.
Ajá, lo he comprobado en el diseño, arrastrando dos etiquetas al mismo sitio y claro, ese era el problema que tenía antes.

Y lo de acceder también lo conseguí ayer toqueteando. Lo que hice fue crear una lista que te fuera añadiendo cada etiqueta a la lista cada vez que se creara una en el bucle. De ese modo, si la lista se llama "l" por ejemplo, pues poniendo l[i] puedo acceder a la label que quiera para modificar el texto, o lo que haga falta.

Muchas gracias por la ayuda. Te lo agradezco mucho.

Ahora me sigue quedando la duda de lo de la seguridad del programa.
La "seguridad" es un tema peliagudo, todo depende de lo inteligente que sea la gente que podría vulnerar la seguridad de tu programa y como de dispuesta esté a ello. La prueba clara son los multiples sistemas de seguridad que se aplican a gran parte del software comercial, que tarde o temprano acaban siendo crackeados (y hablamos de compañias y programadores, que se dedican a esto profesionalmente).

Otro tema a tener en cuenta es que el c# se puede decompilar a código nativo teniendo acceso completo al código fuente con lo que cualquiera sin apenas conocimientos podría evaluar el algoritmo de protección que has introducido y evadirlo.

Resumiendo, vas a perder más tiempo elaborando un sistema de seguridad (teniendo en cuenta que preguntas por ello, asumo que no tienes ni idea de por donde empezar) que probablemente no valga para nada (sin animo de ofender), cuando podrías aprovechar todo ese tiempo en hacer que tu programa haga lo debido y no tenga otro tipo de fallos.
Pues si, tienes razón.Hoy día la seguridad sirve para más bien poco, porque tarde o temprano pasa lo que pasa.

Eso si, si yo sólo le envio a alguien el .exe que está en la carpeta debug del proyecto donde creo el programa...No puede acceder al código fuente del programa, sólo puede ejecutarlo, ¿no?
No, como te decía antes, puede decompilar a partir del ejecutable y sacar todo el código fuente. No tiene ninguna ciencia, hay programas que seleccionas el ejecutable o la libreria (DLL) y te sacan todo y más. Si de verdad te preocupa tanto "proteger" el código, deberías pensar en usar un lenguaje de bajo nivel, ya que con estos generalmente los decompiladores trabajan sobre código máquina.
11 respuestas