Как изменить динамически созданный текст метки при нажатии динамически созданной кнопки в приложении Windows Forms на C#

0

Вопрос

Я пытаюсь динамически создавать некоторые метки и кнопки. Я хочу изменить название этикетки при нажатии кнопки с динамическим ящиком. Когда я пишу метод button_click, я не могу получить прямой доступ к объекту метки. Как я могу это сделать?

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

Лучший ответ

1

То for цикл, который вы написали, знает о кнопке и этикетке. Вы можете использовать это для написания обработчика щелчка, который захватывает метку. Это так же просто, как изменить:

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

Для

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

Это не обязательно должно быть таким коротким. Вы могли бы, например, сделать:

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

Или если у вас есть метод, который "делает что-то"

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

Не совсем уверен, в своем комментарии вы сказали "использовать отправителя", но здесь этот обработчик событий всегда прикрепляется только к одной кнопке, поэтому вам действительно не нужно ничего делать с отправителем, потому что очевидно, какой отправитель есть. Например, у вас может быть:

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

Он отправит слово "hello2" в качестве аргумента (если это вторая часть цикла).. но реально, потому что вы знаете отправителя, вы можете сформировать что угодно:

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

Я предвижу только отправителя, но это будет полезно, если что - то еще изменит пользовательский интерфейс между вами и пользователем, нажавшим кнопку-например, если они запустят процесс, который изменяет тег кнопки, тогда, конечно, используйте отправителя, чтобы получить последнее значение

2021-11-22 09:58:54

Это сработало. Но в моем основном проекте я уже использовал отправителя, поэтому он показывает ошибку. А также мне нужно проверить условия, прежде чем изменять текст этикетки. Итак, можете ли вы предложить способ, чтобы я мог получить доступ к меткам или любому элементу управления с помощью метода click?
jerin sifat

Мне нужно будет увидеть примеры того, что вы хотите сделать; описание немного расплывчатое. Я внесу правку в сообщение, чтобы показать, как вы будете использовать многострочный метод, но будет полезно более конкретное руководство о том, какая помощь вам нужна
Caius Jard
0

Вы можете вести словарь кнопок для меток и использовать его для поиска соответствующей метки. Другим вариантом было бы связать индекс как с кнопкой, так и с меткой и найти соответствующую метку.

Я проиллюстрирую вам вариант словаря.

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

...

В вашем цикле,

mapping[btn] = lbl;

В вашем обработчике,

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

Вам не нужно вести словарь элементов управления; коллекция элементов управления, в которую вы помещаете метку, сделает это за вас
Caius Jard

На самом деле, я никогда не использовал Словарь, поэтому я не понимаю, как я могу получить значение в своем обработчике. Я скопировал ваш код, и он показывает ошибку в обработчике, что сопоставление не объявлено.
jerin sifat

На других языках

Эта страница на других языках

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