C # Windows Forms uygulamasında dinamik olarak oluşturulan düğme tıklatmasında dinamik olarak oluşturulan etiket metni nasıl değiştirilir

0

Soru

Dinamik olarak bazı etiketler ve düğmeler oluşturmaya çalışıyorum. Dinamik olarak kutulanmış düğme tıklamasıyla etiketin adını değiştirmek istiyorum. Button_click yöntemini yazarken, label nesnesine doğrudan erişemiyorum. Bunu nasıl yapabilirim?

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

En iyi cevabı

1

Bu for yazdığınız döngü, düğmeyi ve etiketi bilir. Etiketi yakalayan bir tıklama işleyicisi yazmak için bunu kullanabilirsiniz. Değiştirmek kadar basit:

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

-e doğru

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

Bu kadar kısa olmak zorunda değil. Örneğin şunları yapabilirsiniz:

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

Ya da"bir şeyler yapan" bir yönteminiz varsa

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

Yorumunuzda "göndereni kullan" dediğinizden emin değilim, ancak burada bu olay işleyicisi yalnızca bir düğmeye bağlanır, böylece gönderenle gerçekten bir şey yapmanıza gerek kalmaz, çünkü gönderenin hangisi olduğu açıktır. Örneğin, sahip olabilirsiniz:

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

"Hello2" kelimesini argüman olarak gönderir (eğer döngünün ikinci adımı ise).. ama gerçekçi olarak, göndereni bildiğiniz için her şeyi oluşturabilirsiniz:

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

Ben sadece tahmin gönderenin ama yararlı bir şey başka değişiklikler UI arasında ayarlama ve kullanıcı tıklatarak düğmesini - örneğin eğer onlar koşmak nasıl bir süreç değiştiren düğme Etiketi, kesin, kullanın gönderene al son değer

2021-11-22 09:58:54

Bu işe yaradı. Ancak ana projemde zaten bir gönderici kullandım, bu yüzden bir hata gösteriyor. Ayrıca etiket metnini değiştirmeden önce koşulları kontrol etmem gerekiyor. Tıklama yönteminden etiketlere veya herhangi bir denetime erişebilmem için bir yol önerebilir misiniz?
jerin sifat

Ne yapmak istediğinize dair örnekler görmem gerekecek; açıklama biraz belirsiz. Çok satırlı bir yöntemi nasıl yapacağınızı göstermek için gönderide bir düzenleme yapacağım, ancak hangi yardıma ihtiyacınız olduğuna dair daha spesifik bir yön yararlı olacaktır
Caius Jard
0

Etiket düğmelerinin sözlüğünü koruyabilir ve eşleşen etiketi bulmak için bunu kullanabilirsiniz. Başka bir seçenek, bir dizini hem düğme hem de etiketle ilişkilendirmek ve etiketi bununla bulmak olacaktır.

Size sözlük seçeneğini göstereceğim.

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

...

Senin döngüsünde,

mapping[btn] = lbl;

İşleyicinizde,

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

Mi hiç ihtiyacımız korumak sözlük kontroller; Kontroller koleksiyonu ne olursa olsun sizi etiketinde eder sana
Caius Jard

Aslında, Sözlüğü hiç kullanmadım, Bu yüzden işleyicimde nasıl değer elde edebileceğimi anlamıyorum. Kodunuzu kopyaladım ve işleyicide eşlemenin bildirilmediği bir hata gösteriyor.
jerin sifat

Diğer dillerde

Bu sayfa diğer dillerde

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