Cómo cambiar dinámicamente crea texto de la etiqueta en la creación dinámica de clic de botón en C# aplicación de Formularios Windows forms

0

Pregunta

Estoy tratando de crear algunas etiquetas y botones de forma dinámica. Quiero cambiar la etiqueta del nombre en forma dinámica en la jaula de clic de botón. Cuando estoy escribiendo el button_click método, no puedo acceder a la etiqueta de objeto directamente. ¿Cómo puedo hacer eso?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DemoPanel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            int lblYVal = 10;
            int btnYVal = 50;

            for(int i = 1; i< 5; i++)
            {
                Label lbl = new Label();
                lbl.Text = "test";
                lbl.Name = "test"+i.ToString();
                lbl.Location = new System.Drawing.Point(10, lblYVal);
                lbl.Visible = true;

                Button btn = new Button();
                btn.Text = "Click";
                btn.Name = "textBtn" + i.ToString();
                btn.Location = new System.Drawing.Point(10,btnYVal);
                btn.Visible = true;

                btn.Click += new EventHandler(this.btn_click);


                this.Controls.Add(lbl);
                this.Controls.Add(btn);
                lblYVal += 70;
                btnYVal += 70;
                

            }

        }

        void btn_click(object sender, EventArgs e)
        {
            //How can i change label text from here.
            //lbl.text //Does Not exist Error.
            Label lbl = new Label();
            lbl.Text = "New text"; //Not changing Label text
        }
    }
}
c# desktop-application
2021-11-22 06:03:37
2

Mejor respuesta

1

El for bucle que has escrito sabe sobre el botón y la etiqueta. Usted puede aprovechar para escribir un controlador de clic que captura la etiqueta. Es tan sencillo como cambiar:

btn.Click += new EventHandler(this.btn_click);

A

btn.Click += (sender, args) => lbl.Text = "Clicked";

No tiene que ser tan corto. Usted podría, por ejemplo hacer:

btn.Click += (sender, args) => {
  if(something > 0)
    lbl.Text = "Did the process because something was > 0";
  else
    lbl.Text = "Can't start the process because something is 0";
}

O si usted tiene un método que "hace cosas"

void DoTheProcessAndOutputToTheLabel(Label x){
  int i = 0;
  foreach(var thing in things){
    bool success = ProcessTheThing(thing);
    if(success)
      i++;
  }
  x.Text = $"Processed {i} things";
}

btn.Click += (sender, args) => DoTheProcessAndOutputToTheLabel(lbl);

No muy seguro, en su comentario que dice "usar el remitente" pero aquí este controlador de eventos, sólo se conecta a un botón para que usted realmente no necesita hacer nada con el remitente porque es obvio que el remitente es es. Por ejemplo, usted puede tener:

btn.Tag = "hello"+i;
btn.Click += (sender, args) => DoTheProcessAndOutputToTheLabel(lbl, (sender as Control).Tag);

Va a enviar la palabra "hello2" como un argumento (si es el segundo en ir de el bucle).. pero en la realidad, porque sabe que el remitente podría llegar a formar cualquier cosa:

var x = "hello"+i;
btn.Click += (sender, args) => DoTheProcessAndOutputToTheLabel(lbl, x);

Yo sólo prever el remitente pero ser útil si hay algo más que cambios en la interfaz de usuario entre los que la configuración y el usuario hace clic en el botón, por ejemplo, si se ejecuta un proceso que altera el botón de Etiqueta, a continuación, seguro, use el remitente para agarrar el valor más reciente

2021-11-22 09:58:54

Esto funcionó. Pero en mi proyecto principal, ya he utilizado un remitente por eso se muestra un error. Y también tengo que consultar condiciones antes de cambiar el texto de la etiqueta. Por lo que se puede sugerir una manera para que yo pueda obtener acceso a las etiquetas o cualquier control de la haga clic en el método?
jerin sifat

Voy a necesitar para ver ejemplos de lo que quieres hacer; la descripción es un poco vago. Voy a hacer una edición para el post para mostrar cómo te gustaría hacer un multi método de línea, pero algunos de dirección más específica sobre qué tipo de ayuda necesita será útil
Caius Jard
0

Usted puede mantener un diccionario de botones con las etiquetas y el uso que para encontrar la coincidencia de la etiqueta. Otra opción sería la de asociar un índice con tanto botón y la etiqueta y buscar la etiqueta con que.

Voy a ilustrar el diccionario opción para usted.

Dictionary<Button, Label> mapping = new Dictionary<Button, Label>();

...

En su bucle,

mapping[btn] = lbl;

En el controlador,

((Label)mapping[(Button)sender)]).Text = "some text";
2021-11-22 07:18:13

Usted no necesita mantener un diccionario de los controles; la colección de Controles de lo que usted les ponga la etiqueta que va a hacer por usted
Caius Jard

En realidad, yo nunca he usado el Diccionario, Así que no entiendo cómo puedo obtener el valor de mi controlador. He copiado el código y Se muestra un error en el controlador de la asignación no declarado.
jerin sifat

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................