Jak změnit dynamicky vytvořený štítek text na dynamicky vytvořené tlačítko, klepněte na tlačítko v C# Windows Forms aplikace

0

Otázka

Snažím se vytvořit některé popisky tlačítek a dynamicky. Chci změnit štítek na jméno na dynamicky kleci tlačítko klepněte na tlačítko. Když píšu metoda button_click, nemohu se dostat na štítku objekt přímo. Jak to mám udělat, že?

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

Nejlepší odpověď

1

Na for smyčka jste napsal, ví, o tlačítko a label. Můžete využít této napsat click handler, který zachytí etiketu. Je to tak jednoduché, jak se mění:

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

K

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

Nemusí to být tak krátké. Můžete například udělat:

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

Nebo pokud máte metodu, která "dělá věci"

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

Ne tak docela jisti, ve váš komentář, řekl, "použití odesílatele", ale tady tato událost obslužnou rutinu, pouze je někdy přikládá na jedno tlačítko, takže nemusíte opravdu potřebujete udělat něco s odesílateli, protože je zřejmé, které odesílatel je. Například můžete mít:

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

To bude odeslat slovo "hello2" v jako argument (pokud je to to druhé smyčky).. ale realisticky, protože víte, odesílatel mohl tvořit něco:

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

Jen jsem předvídat, odesílatele, ale být užitečné, pokud se něco změní uživatelské ROZHRANÍ mezi ty nastavení a uživatel kliknutím na tlačítko - například, když se spustit proces, který mění tlačítko Tag, tak určitě použijte jej, aby chytit nejnovější hodnoty

2021-11-22 09:58:54

To fungovalo. Ale v mém hlavním projektu, jsem již použil odesílatel, že je důvod, proč to ukazuje chybu. A také musím zkontrolovat podmínky před změnou text na štítku. Takže můžete navrhnout tak, že můžu získat přístup do etikety nebo žádnou kontrolu od click metoda?
jerin sifat

Budu se muset podívat na příklady toho, co chcete dělat; popis je trochu neurčitý. Dám upravit příspěvek, aby ukázal, jak byste to udělat multi-line metody, ale nějaký konkrétnější směr na to, co pomoc, kterou potřebujete, bude užitečné
Caius Jard
0

Můžete udržovat slovník tlačítka štítků a použít k najít odpovídající štítek. Další možností by bylo spojit index s oběma tlačítko a štítek a štítek.

Budu ilustrovat slovník možnost pro vás.

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

...

Ve své smyčky,

mapping[btn] = lbl;

V tvým poručníkem,

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

Nemusíte udržovat slovník ovládací prvky; Ovládací prvky kolekce, co si dát štítek bude to pro vás
Caius Jard

Vlastně, nikdy jsem použít Slovník, Takže nechápu, jak se můžu dostat hodnotu v mým poradcem. Zkopíroval jsem svůj kód a To ukazuje chybu v mapování obslužné rutiny, které není deklarováno.
jerin sifat

V jiných jazycích

Tato stránka je v jiných jazycích

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