Como alterar dinamicamente criado o rótulo de texto dinamicamente criados clique de botão em C# Windows Forms aplicação

0

Pergunta

Estou tentando criar alguns rótulos de botões e dinamicamente. Eu quero mudar o nome do marcador dinamicamente engaiolados clique de botão. Quando eu estou escrevendo button_click método, eu não consigo acessar o rótulo de objeto diretamente. Como posso fazer isso?

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

Melhor resposta

1

O for loop você escreveu sabe sobre o botão e o rótulo. Você pode aproveitar isso para escrever um manipulador de clique, que capta o rótulo. É tão simples como mudar:

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

Para

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

Ele não tem que ser tão curto. Você pode, por exemplo:

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 se você tem um método que "faz coisas"

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

Não é bem certo que, no seu comentário você disse que "usar o remetente", mas aqui esse manipulador de eventos só anexa a um botão, então você realmente não precisa fazer nada com o remetente porque é óbvio que o remetente é. Por exemplo, você pode ter:

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

Ele vai enviar a palavra "hello2" como um argumento (se é a segunda partida do ciclo).. mas, realisticamente, porque você sabe o remetente você pode formar qualquer coisa:

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

Eu só prever o remetente, mas ser útil se algo muda a INTERFACE entre a configuração e o usuário clicar no botão - por exemplo, se executar um processo que altera o botão de Tag, em seguida, a certeza, utilize o remetente para pegar o valor mais recente

2021-11-22 09:58:54

Isso funcionou. Mas no meu projeto principal, eu já usei um remetente que é por isso que ele está mostrando um erro. E também eu preciso de condições de verificação antes de alterar o texto do rótulo. Assim, você pode sugerir um caminho para que eu possa ter acesso a rótulos ou qualquer controle do método de clique?
jerin sifat

Eu vou precisar para ver exemplos do que você quer fazer; a descrição é um pouco vago. Eu vou editar o post para mostrar como você faria um multi-método de linha, mas um pouco mais de sentido específico em que tipo de ajuda você precisa ser útil
Caius Jard
0

Você pode manter um dicionário de botões para etiquetas e usar isso para encontrar o rótulo correspondente. Outra opção seria a de associar um índice com botão e o rótulo e encontrar a etiqueta com isso.

Vou ilustrar o dicionário opção para você.

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

...

Em seu ciclo,

mapping[btn] = lbl;

Em seu manipulador,

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

Você não precisa manter um dicionário de controles; a colecção de Controlos de tudo o que você colocar a etiqueta vai fazer isso por você
Caius Jard

Na verdade, eu nunca usei Dicionário, Então eu não entendo como posso obter o valor na minha rotina de tratamento. Eu copiei o código e Ele mostra um erro no processador que o mapeamento não é declarado.
jerin sifat

Em outros idiomas

Esta página está em outros idiomas

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