Comment modifier dynamiquement créé le texte de l'étiquette sur dynamiquement créé cliquez sur le bouton en C# application Windows Forms

0

La question

Je suis en train de créer des étiquettes et les boutons de manière dynamique. Je veux changer le nom du libellé de façon dynamique dans des caisses clic sur le bouton. Quand je suis en train d'écrire le button_click méthode, je ne peux pas accéder à l'étiquette de l'objet directement. Comment puis-je le faire?

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

La meilleure réponse

1

L' for la boucle que vous avez écrit sait sur le bouton et l'étiquette. Vous pouvez tirer parti de cette fonction pour écrire un gestionnaire de clic qui permet de saisir l'étiquette. C'est aussi simple que de changer:

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

Pour

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

Il n'a pas à être de courte durée. Vous pourriez par exemple faire:

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";
}

Ou si vous avez une méthode qui fait les choses"

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

Pas tout à fait sûr, dans votre commentaire vous avez dit "utiliser l'expéditeur" mais ici, ce gestionnaire d'événement à ne jamais s'attache à un bouton de sorte que vous n'avez pas vraiment besoin de faire quelque chose avec l'expéditeur car il est évident que l'expéditeur est est. Par exemple, vous pourriez avoir:

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

Il va envoyer le mot "hello2" comme un argument (si c'est le deuxième aller de la boucle).. mais, en réalité, parce que vous connaissez l'expéditeur vous pourriez formulaire de quoi que ce soit:

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

Je ne prévoir de l'expéditeur, mais d'être utile si quelque chose d'autre modifications de l'INTERFACE entre vous la configuration et de l'utilisateur en cliquant sur le bouton, si par exemple, l'exécution d'un processus qui modifie le bouton de la Balise, puis bien sûr, l'utilisation de l'expéditeur à prendre la dernière valeur

2021-11-22 09:58:54

Cela a fonctionné. Mais dans mon projet principal, j'ai déjà utilisé un expéditeur c'est pourquoi il affiche une erreur. Et aussi j'ai besoin de vérifier les conditions avant de modifier le texte de l'étiquette. Donc, pouvez-vous suggérer un moyen pour que je puisse avoir accès à des étiquettes ou de tout contrôler à partir de la méthode de clic?
jerin sifat

Je vais avoir besoin de voir des exemples de ce que vous voulez faire; la description est un peu vague. Je vais faire un edit pour le post pour montrer comment vous pouvez faire un multi méthode de la ligne, mais certains des indications plus précises sur ce que l'aide dont vous avez besoin sera utile
Caius Jard
0

Vous pouvez maintenir un dictionnaire de boutons, des étiquettes et de l'utiliser pour trouver l'étiquette correspondante. Une autre option serait d'associer un indice à la fois avec bouton et étiquette et de trouver l'étiquette avec qui.

Je vais illustrer le dictionnaire option pour vous.

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

...

Dans votre boucle,

mapping[btn] = lbl;

Dans votre gestionnaire,

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

Vous n'avez pas besoin de maintenir un dictionnaire des contrôles; la collection de Contrôles de quoi vous mettre l'étiquette dans le ferons pour vous
Caius Jard

En fait, je n'ai jamais utilisé le Dictionnaire, Donc je ne comprends pas comment puis-je obtenir la valeur dans mon gestionnaire. J'ai copié ton code et Il affiche une erreur dans le gestionnaire que la cartographie n'est pas déclaré.
jerin sifat

Dans d'autres langues

Cette page est dans d'autres langues

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