从“列表值”填充文本框

本文关键字:填充 文本 列表值 列表 | 更新日期: 2023-09-27 18:21:35

我有一个从LINQ到XML查询创建的列表。该列表可以包含1、2、3或4个值。表单上有四个文本框,应该根据列表中的值填充,但我不知道如何做到这一点,因为列表中的元素数量会有所不同。根据列表中的值数量动态创建文本框会更好吗?我该怎么做?

这似乎是一项相当常见的任务,但我一直未能找到解决方案。如有任何帮助,我们将不胜感激。

从“列表值”填充文本框

动态创建,或者只是填充现有的4,都无关紧要。选择最适合您的UI需求的一个。(甚至可能是已经提出的DGV)

首先,你需要一些包含控件的东西,比如说你有一个名为MyPanel的面板,它只包含这些文本框,而不包含其他内容。。。

以下是动态加载方法:

MyPanel.Controls.Clear();
int count = 1;
foreach(var item in listOfValues)
{
    TextBox tb = new TextBox();
    tb.Name = "MyTextbox" + i;
    tb.Text = item.ToString();//or whatever property you have for the value
    tb.Location = new Point(0, 0 + (25 * (i - 1)));
    MyPanel.Controls.Add(tb);
}

以下是填充现有方法,假设您有4个名为"TextBox1"的TextBoxes,例如:

int count = 1;
foreach(var item in listOfValues)
{
    TextBox tb = MyPanel.Controls.Find("TextBox" + i) as TextBox;
    tb.Text = item.ToString();//or whatever property you have for the value
}

注意:您需要确保listOfItems包含的项目不会超过您的文本框,否则您将得到一个异常

假设您有一个列表

       List<int> testList = new List<int>(){1,2,3};
       foreach(int i in testList)
        {
          TextBox test = new TextBox();
          test1.Name = "textBox"+i;
           youcOntrl.Controls.Add(test1);
         }    

您还可以提供它们的位置和大小等。

听起来你想创建一个foreach循环并循环linq查询,在每个查询上创建一个新的文本框并将其添加到表单中。这将有助于了解到目前为止你得到了什么。我在下面举了一个例子,使用列表而不是linq查询,但后面的是相同的

private void Form1_Load(object sender, EventArgs e)
    {
        var newList= new List<string> {"box1", "box2", "box3"};
        foreach (var boxName in newList)
        {
            TextBox newTextBox = new TextBox();
            newTextBox.Text = boxName;
            this.Controls.Add(newTextBox);
        }
    }

您可以在表单设计器中创建4个文本框,并将其Visible属性设置为false作为默认值(从属性窗格)。

然后,您可以按如下方式打开列表的计数属性:

switch (els.Count)
{
    case 1:
        textBox1.Text = els[1].Value;
        textBox1.Visible = true;
        break;
    case 2:
        textBox1.Text = els[1].Value;
        textBox1.Visible = true;
        textBox2.Text = els[2].Value;
        textBox2.Visible = true;
        break;
    case 3:
        textBox1.Text = els[1].Value;
        textBox1.Visible = true;
        textBox2.Text = els[2].Value;
        textBox2.Visible = true;
        textBox3.Text = els[3].Value;
        textBox3.Visible = true;
        break;
    case 4:
        textBox1.Text = els[1].Value;
        textBox1.Visible = true;
        textBox2.Text = els[2].Value;
        textBox2.Visible = true;
        textBox3.Text = els[3].Value;
        textBox3.Visible = true;
        textBox4.Text = els[4].Value;
        textBox4.Visible = true;
        break;
    default:
        break;
}

如果您的列表是IEnumerable,则必须首先对其调用ToList()方法以获得List<XElement>,因为IEnumerable类型没有Count属性。

如果是四个或更少,则不必动态创建文本框。您可能会禁用无法填充的文本框。特别是,如果你按照TextBox1、TextBox2等顺序命名你的文本框,那么你可能会编码为:

    for (int i = 1; i <= 4; i++)
    {
         if (i <= list.Count)
            { 
              this.Controls["TextBox"+i.ToString()].Text = list[i-1];
              this.Controls["TextBox"+i.ToString()].Enabled = True;
             }
         else
             {
               this.Controls["TextBox"+i.ToString()].Enabled = False;
             }                 
    }

因此,例如,如果您的列表中有2个项目,那么List.Count为2,因此将填充Textbox1和2,并禁用TextBox3和4。