Come modificare dinamicamente creato etichetta di testo creato in modo dinamico clic sul pulsante in C# applicazione Windows Form

0

Domanda

Sto cercando di creare un certo numero di etichette e pulsanti in modo dinamico. Voglio cambiare il nome dell'etichetta in modo dinamico con imballaggio clic del pulsante. Quando sto scrivendo button_click metodo, non riesco ad accedere oggetto label direttamente. Come posso fare?

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

Migliore risposta

1

Il for loop che hai scritto conosce il pulsante e l'etichetta. È possibile utilizzare questa opzione per scrivere un gestore di clic che cattura l'etichetta. È semplice come cambiare:

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

Per

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

Non deve essere così breve. Si potrebbe, per esempio fare:

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 se si dispone di un metodo che "fa qualcosa"

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);

Non sono del tutto sicuro, nel tuo commento hai detto "utilizzare il mittente", ma qui questo gestore di eventi sempre, e solo, si attacca a un bottone, in modo che non si ha realmente bisogno di fare qualcosa con il mittente perché è ovvio che il mittente è. Per esempio si potrebbe avere:

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

Invia la parola "hello2" come argomento (se è il secondo del ciclo).. ma realisticamente, perché si conosce il mittente si potrebbe formare qualcosa:

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

Ho solo prevedere il mittente, ma di essere utile se qualcosa cambia l'interfaccia tra l'utente impostazione e l'utente, cliccando il pulsante - per esempio, se si esegue un processo che altera il pulsante Tag, quindi sicuri, utilizzare il mittente per afferrare l'ultimo valore

2021-11-22 09:58:54

Questo ha funzionato. Ma nel mio progetto principale, e l'ho già usato un mittente ecco perché si sta mostrando un messaggio di errore. E inoltre ho bisogno di verificare le condizioni prima di modificare il testo dell'etichetta. Così si può suggerire un modo in modo che io possa ottenere l'accesso a etichette o alcun controllo da parte del metodo di clic?
jerin sifat

Ho bisogno di vedere alcuni esempi di ciò che si vuole fare; la descrizione è un po ' vago. Faccio un edit al post per mostrare come faresti una linea multi metodo, ma alcune più specifiche indicazioni di cosa aiuto di cui avete bisogno sarà utile
Caius Jard
0

È possibile mantenere un dizionario di pulsanti per etichette e utilizzarlo per trovare l'etichetta di corrispondenza. Un'altra opzione potrebbe essere quella di associare un indice sia con pulsante e l'etichetta e trovare l'etichetta con che.

Illustrerò il dizionario opzione per voi.

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

...

Nel ciclo,

mapping[btn] = lbl;

Del gestore,

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

Non c'è bisogno di mantenere un dizionario dei controlli; l'insieme di Controlli, di tutto ciò che hai messo l'etichetta di farlo per voi
Caius Jard

In realtà, non ho mai usato il Dizionario, Quindi non capisco come posso ottenere il valore, a mio gestore. Ho copiato il tuo codice e mostra un errore del gestore che la mappatura non è dichiarato.
jerin sifat

In altre lingue

Questa pagina è in altre lingue

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