我有一个从LINQ to XML查询创建的列表。该列表可以包含1,2,3或4个值。我在表单上有四个文本框,应根据List中的值填充,但我无法弄清楚如何执行此操作,因为列表中的元素数量会有所不同。根据列表中的值的数量动态创建文本框会更好吗?我怎么能这样做?
这似乎是一项相当普遍的任务,但我无法找到解决方案。任何帮助将不胜感激。
答案 0 :(得分: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);
}
}
答案 1 :(得分: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);
}
您也可以向他们提供他们的位置和大小等。
答案 2 :(得分: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个TextBox,例如名为“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不包含比您有文本框更多的项目,否则您将获得异常
答案 3 :(得分:0)
您可以在表单设计器中创建4个文本框,并将其Visible
属性设置为默认值(从属性窗格中)。
然后,您可以按如下方式打开列表的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
属性。< / p>
答案 4 :(得分:0)
如果它是4或更少,那么您不必动态创建文本框。您可以禁用无法填充的文本框。特别是如果您按顺序命名文本框,如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。