如何改变动态创建的标签上的文字动态创建的按一下按钮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);

我只能预见的发件人,但是有用的,如果其他东西改变UI你们之间的设立和用户的点击按钮-例如如果他们运行的一个过程,改变了按钮标签,然后确定,使用发送者获取最新的价值

2021-11-22 09:58:54

这一工作。 但在我的主要项目,我已经用了一个发件人这就是为什么它是表示一个错误。 并且我需要检查的条件之前改变标签的案文。 所以你可以建议的方式这样我就可以获得标签或任何控制自击方法?
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ý
..................................................................................................................