0

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

看起来这将是一项相当普遍的任务,但我一直无法找到解决方案。任何帮助将不胜感激。

4

5 回答 5

0

如果它是四个或更少,那么您不必动态创建文本框。您可能会禁用无法填充的文本框。特别是如果您按顺序命名您的文本框,如 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;
             }                 
    }

因此,例如,如果您的 List 中有 2 个项目,则 List.Count 为 2,因此将填充 Textbox1 和 2,而 TextBox3 和 4 将被禁用。

于 2013-07-09T13:04:54.710 回答
0

假设你有一个列表

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

你也可以给他们他们的位置和大小等。

于 2013-07-09T12:44:50.740 回答
0

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

然后,您可以打开列表的 count 属性,如下所示:

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属性。

于 2013-07-09T12:59:35.037 回答
0

动态创建,或者只是填充现有的 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”的文本框,例如:

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 包含的项目不超过您拥有的文本框,否则您将收到异常

于 2013-07-09T12:48:09.370 回答
0

听起来您想创建一个 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);
        }
    }
于 2013-07-09T12:40:00.457 回答