Ako sa menia dynamicky vytvorené label text na dynamicky vytvorené tlačidlo v C# Windows Formy aplikácie

0

Otázka

Snažím sa vytvoriť niektoré štítky a tlačidlá dynamicky. Chcem zmeniť menovku meno na dynamicky crated tlačidlo. Keď píšem button_click metóda, nemôžem prístup označenie objektu priamo. Ako môžem to urobiť?

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

Najlepšiu odpoveď

1

Na for slučky, ktoré ste napísali vie o tlačidlo a etikete. Môžete využiť tento napísať kliknite handler, ktorý zachytáva štítku. Je to rovnako jednoduché ako zmena:

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

Na

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

To nemusí byť tak krátky. Môžete napríklad urobiť:

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

Alebo ak máte spôsob, ktorý "robí veci"

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 je celkom istý, v komentári povedal si: "použitie odosielateľ", ale tu to event handler, len niekedy sa viaže na jedno tlačidlo, takže nepotrebujete robiť niečo s odosielateľovi, pretože je zrejmé, ktorý je odosielateľ je. Napríklad môžete mať:

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

To bude odoslať slovo "hello2" v ako argument (ak je to druhý ísť slučky).. ale realisticky, pretože viete, že odosielateľ si mohli vytvoriť niečo:

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

Len som sa predpokladá odosielateľa, ale je užitočné, ak niečo iné zmeny UI medzi vami nastavenie a používateľ kliknutím na tlačidlo - napríklad, ak sa spustiť proces, ktorý sa mení na tlačidlo Menovky, potom ste istí, použite odosielateľa, aby sa chytiť najnovšie hodnota

2021-11-22 09:58:54

Fungovalo to. Ale v mojich hlavných projekt, už som sa používa odosielateľa, že je dôvod, prečo to ukazuje chybu. A tiež musím skontrolovať podmienky pred výmenou label text. Tak môžete navrhnúť tak, aby som mohol získať prístup k štítky alebo akejkoľvek kontroly zo kliknite na položku metóda?
jerin sifat

Budem potrebovať pozri príklady toho, čo chcete robiť; opis je trochu nejasné. Urobím upraviť na post ukázať, ako by ste to multi line metóda, ale niektoré ďalšie špecifické smere na čo pomoc, ktorú potrebujete, bude užitočné
Caius Jard
0

Môžete udržiavať slovník tlačidlá na etikety a použitie, ktoré sa nájsť zodpovedajúce označenie. Ďalšou možnosťou by bolo priradiť index s oboma tlačidlo a označte a nájsť štítok s tým.

Budem ilustráciu slovník možnosť vám.

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

...

Vo vašom slučky,

mapping[btn] = lbl;

Vo vašom handler,

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

Nemusíte na zachovanie slovník kontrol, Kontrol zberu čo si dať štítok bude to pre vás
Caius Jard

Vlastne som nikdy použitý Slovník, Tak nechápem, ako som si hodnoty v mojom handler. Som skopírovali váš kód a zobrazuje chyba v handler, že mapovanie nie je deklarované.
jerin sifat

V iných jazykoch

Táto stránka je v iných jazykoch

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