在C#中获取值动态文本框

本文关键字:动态 文本 获取 | 更新日期: 2023-09-27 18:23:56

我制作了动态文本框,并将其保留为List

private void ConvertButton_Click(object sender, EventArgs e)
{
  List<TextBox> textBoxes = new List<TextBox>();
  foreach (Control item in this.Controls)
  {
    if (item is TextBox)
     {
       TextBox txt = item as TextBox;
       textBoxes.Add(txt);                  
     }
  }        
}

我得到了所有文本框的值,但我有一个问题。例如:;如果用户添加3个像(A,B,C)这样的标签,并为它们添加像(labelA有2,labelB有3,labelC有1)这样的文本框,并且文本框得到像数组一样的值(Textboxes[0]有值)。问题是我不知道哪个标签有哪个值。

我添加了这样的文本框:

private void addNewTextbox(object sender, EventArgs e)
{
   Button button = (Button)sender;
   List<TextBox> textBoxes = button.Tag as List<TextBox>;
   if (textBoxes == null)
      button.Tag = textBoxes = new List<TextBox>();
   TextBox textBox = new TextBox();
   textBoxes.Add(textBox);
   textBox.Location = new Point(90 * textBoxes.Count, button.Top);
   textBox.Size = new Size(50, 50);
   this.Controls.Add(textBox);
}

例如,我尝试显示屏幕;

LabelA-->Textbox1 , Textbox2
</br>
labelB -->Textbox3
</br>
LabelC --> Textbox4 , Textbox5 , TextBox6

在C#中获取值动态文本框

添加的每个控件都有一个Name属性。使用此属性可以将不同的控件链接在一起。例如(您应该想出自己的命名约定),您可以这样做:

标签A-->文本框A1、文本框A2

标签B-->文本框B1

标签C-->文本框C1、文本框C2、文本框C3

如果你想有一个更完整(即复杂)的解决方案,你可以:

  1. 创建从TextBox继承的自己的控件
  2. 为关联的Label控件的名称添加属性
  3. 在实例化新控件时设置此属性
        Label[] labelArray = new Label[10];

        for (int i = 0; i < labelNumber; i++)
        {
            labelArray[i] = new Label();
            labelArray[i].Text = states[i] + "-->";
            this.Controls.Add(labelArray[i]);
            labelArray[i].Top = 100 + i * 30;
            labelArray[i].Left = 10;
            labelArray[i].Width = 30;
        }

我创建的标签就是这样的。标签数量是用户想要的标签数量@拦截风

我很难理解你的问题,我想你是在试图将用户创建的文本框链接到特定的标签?如果我完全错了,请原谅我。把你的代码结构成这样怎么样:

注:使用OP的新代码编辑

    Dictionary<Int, List<TextBox>> label_Textboxes_Dict = new Dictionary<Int, List<TextBox>>();
    List<Label> labelArray = new List<Label>(); //I suggest use list as you don't know the array size beforehand
    void addLabel(int labelNumber)
    {
        int currentLabelArrayCount = labelArray.count; //So that users can add multiple times
        for (int i = currentLabelArrayCount; i < currentLabelArrayCount +labelNumber; i++)
        {
            labelArray.Add(new Label());
            labelArray[i].Text = states[i] + "-->";
            this.Controls.Add(labelArray[i]);
            labelArray[i].Top = 100 + i * 30;
            labelArray[i].Left = 10;
            labelArray[i].Width = 30;
            label_Textboxes_Dict.Add(i, new List<TextBox>());
        }
    }
    void addTextBoxForLabel(int labelNum)
    {
        TextBox t1 = new TextBox();
        TextBox t2 = new TextBox();
        //etc... 
        if (label_Textboxes_Dict.ContainsKey(labelNum))
        {
            label_Textboxes_Dict[labelNum].Add(t1);
            label_Textboxes_Dict[labelNum].Add(t2);
        }
    }
    void doSomethingForAllTextboxesOfLabel(int labelNum)
    {
        List<TextBox> listOfTextBoxes;
        if(label_Textboxes_Dict.TryGetValue(labelNum, out listOfTextBoxes))
        {
            foreach(TextBox tb in listOfTextBoxes)
            {
                //do your stuff
            }
        }
    }