首页 > 解决方案 > 如何访问和更改我动态创建的标签的属性

问题描述

我想改变using s 的Text属性,就像在 hangman 中一样;但是在我创建之后,当我尝试访问特定的标签时我变得很困惑LabelButtonLabel

// creating label
for (int i = 0; i < numericUpDown1.Value; i++)
{
    Label l = new Label();
    l.Text = "_";
    l.Width = 20;
    l.Height = 25;
    l.Left = i * 20 + 510;
    l.Top = 20;
    l.BackColor = Color.Transparent;
    groupBox2.Controls.Add(l);
}

// function to change the label text
// if I clicked the button
// the first label text will be changed to the text in the button i clicked
private void B_Click(object sender, EventArgs e)
{
    var thsBtn = (Button)sender;
    bool benar = false;

    if (benar == false)
    {
        thsBtn.Text = " ";

        thsBtn.Enabled = false;
    }
    else
    {
        thsBtn.Enabled = false;
    }
}

标签: c#winforms

解决方案


您可以将created组织Label到一个集合中,例如List<Label>

   private List<Label> m_CreatedLabels = new List<Label>();

   ...

   // Remove all previous labels 
   foreach (Label lbl in m_CreatedLabels)  
     lbl.Dispose();

   m_CreatedLabels.Clear();       

   // Create new ones 
   for (int i = 0; i < numericUpDown1.Value; i++) {
     m_CreatedLabels.Add(new Label() {
       Text      = "_",
       Width     = 20,
       Height    = 25, 
       Left      = i * 20 + 510,
       Top       = 20,
       BackColor = Color.Transparent,
       Parent    = groupBox2
     });
   }

现在您可以m_CreatedLabels使用已创建的集合Label,例如

private void B_Click(object sender, EventArgs e) {
  var thsBtn = sender as Button; 

  // you may want to add a condition into FirstOrDefault(), e.g. 
  //   .FirstOrDefault(lbl => lbl.Text == "_") 
  // - first label with "_" Text
  Label lblToProcess = m_CreatedLabels
    .FirstOrDefault(); 

  if (null != lblToProcess) 
    lblToProcess.Text = thsBtn.Text; 

  thsBtn.Enabled = false; 
}

推荐阅读