Jak zmienić dynamicznie wygenerowany tekst etykiety po naciśnięciu dynamicznie utworzonego przycisku w aplikacji Windows Forms C#

0

Pytanie

Staram się dynamicznie tworzyć niektóre etykiety i przyciski. Chcę zmienić nazwę etykiety po naciśnięciu przycisku z dynamicznym pocztową. Kiedy piszę metoda button_click, nie mogę uzyskać bezpośredni dostęp do obiektu etykiety. Jak mogę to zrobić?

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

Najlepsza odpowiedź

1

To for cykl, który napisałeś, wie o przycisku i etykiety. Można to wykorzystać do pisania obsługi kliknięcia, który zapiera dech w etykietę. To jest tak proste, jak zmienić:

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

Dla

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

To nie musi być tak krótki. Można na przykład zrobić:

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

Lub jeśli masz metodę, która "robi coś"

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

Nie do końca jestem przekonany, że w swoim komentarzu pan powiedział "korzystać nadawcy", ale tutaj ten moduł obsługi zdarzeń zawsze przyczepia się tylko do jednego przycisku, więc naprawdę nie trzeba nic robić z nadawcą, bo oczywiście to, co nadawca ma. Na przykład, u ciebie może być:

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

On wyśle słowo "hello2" jako argument (jeśli jest to druga część cyklu).. ale prawdziwe, bo znasz nadawcę, można tworzyć cokolwiek:

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

Przewiduję tylko nadawcy, ale to będzie przydatne, jeśli coś się jeszcze zmieni interfejs między użytkownikiem a użytkownikiem, нажавшим przycisk-na przykład, jeśli trafi proces, który zmienia tag przycisku, wtedy, oczywiście, użyj nadawcy, aby uzyskać ostatnia wartość

2021-11-22 09:58:54

To zadziałało. Ale w moim zasadzie projekcie użyłem nadawcy, więc to pokazuje błąd. A także muszę sprawdzić warunki, zanim zmieniać tekst etykiety. Tak więc, można zaproponować sposób, abym mógł uzyskać dostęp do etykiet lub każdego elementu sterowania za pomocą metody click?
jerin sifat

Muszę zobaczyć przykłady tego, co chcesz zrobić; opis trochę rozmyty. Zabiorę ją do wiadomości, aby pokazać, jak będziesz używać multiline metoda, ale będzie przydatne bardziej konkretne przypomnienie o tym, jaka pomoc jest ci potrzebna
Caius Jard
0

Można prowadzić słownik przycisków dla etykiet i użyć go do znalezienia odpowiedniego oznaczenia. Innym rozwiązaniem byłoby połączyć indeks jak z przyciskiem, jak i z etykietą i znaleźć odpowiedni znacznik.

Ja проиллюстрирую wersję słownika.

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

...

W swoim cyklu,

mapping[btn] = lbl;

W swojej obsłudze,

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

Nie musisz prowadzić słownik elementów sterowania; zbiór elementów sterowania, w którym można umieścić etykietę, zrobi to za ciebie
Caius Jard

W rzeczywistości, nigdy nie używałem Słownika, więc nie rozumiem, jak mogę uzyskać wartość w jego obsłudze. Skopiowałem twój kod, a on pokazuje błąd w obsłudze, że zestawienie nie ogłoszone.
jerin sifat

W innych językach

Ta strona jest w innych językach

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