Cum de a schimba în mod dinamic creat eticheta text pe create dinamic faceți clic pe butonul în C# Windows Forms

0

Problema

Eu sunt încercarea de a crea unele etichete și butoane dinamic. Vreau sa schimb numele etichetei pe dinamic creat clic pe butonul. Atunci când am scris button_click metoda, eu nu pot accesa eticheta de obiect direct. Cum pot face asta?

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

Cel mai bun răspuns

1

La for buclă ai scris știe despre butonul și eticheta. Puteți utiliza acest pentru a scrie un click handler, care surprinde eticheta. E la fel de simplu ca schimbarea:

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

Pentru a

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

Nu trebuie să fie atât de scurt. Ai putea, de exemplu:

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

Sau dacă aveți o metodă care "face lucruri"

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

Nu este destul de sigur, in comentariul tau ai spus "utilizarea expeditor", dar aici acest event handler doar se atașează la un singur buton, astfel încât să nu trebuie să faci nimic cu expeditorul, pentru că e evident care expeditorul este. De exemplu, ai putea avea:

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

Va trimite cuvântul "hello2" în ca un argument (daca e cel de-al doilea merge de bucla).. dar realist, pentru că știi expeditorului te-ar putea forma ceva:

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

Am doar prevedea expeditorul, dar fiind util dacă ceva schimbări UI între înființarea și utilizator făcând clic pe butonul - de exemplu, dacă se execută un proces care modifică butonul de Tag-ul, atunci sigur, utilizați expeditor pentru a apuca cea mai recentă valoare

2021-11-22 09:58:54

Aceasta a lucrat. Dar în proiectul meu principal, am folosit deja un expeditor de aceea se dă o eroare. Și, de asemenea, trebuie să verificați condițiile înainte de a schimba textul de pe etichetă. Atât pot să vă sugerez un mod, astfel încât să pot avea acces la etichete sau nici un control din partea faceți clic pe metoda?
jerin sifat

Am nevoie pentru a vedea exemple de ceea ce vrei să faci; descrierea este un pic vag. Voi face un edit la post pentru a arăta cum ai face un multi-linie, metoda, dar unele mai specifice, direcția pe care ajutorul de care ai nevoie va fi util
Caius Jard
0

Puteți menține un dicționar de butoane pentru etichete și de a folosi că, pentru a găsi de potrivire eticheta. O altă opțiune ar fi să se asocieze un index cu atât buton și eticheta și pentru a găsi eticheta cu asta.

Voi ilustra dicționar opțiune pentru tine.

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

...

În buclă,

mapping[btn] = lbl;

În handler-ul,

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

Nu aveți nevoie pentru a menține un dicționar de control; Controalele colecție de ce ai pus eticheta va face pentru tine
Caius Jard

De fapt, n-am folosit niciodată Dicționar, Așa că nu înțeleg cum pot obține o valoare în handler. Am copiat codul dvs. și arată o eroare în handler care cartografiere nu este declarat.
jerin sifat

În alte limbi

Această pagină este în alte limbi

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