[英]How can i add all the strings from a List<string> to a textbox?
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (true)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
string content = downloadContent();
GetProfileNames(content);
GetTextFromProfile(content);
for (int i = 0; i < names.Count; i++)
{
namesAndTexts.Add(names[i] + " " + texts[i]);
}
if (InvokeRequired)
{
for (int f = 0; f < namesAndTexts.Count -1; f++)
{
BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
}
}
reader.Close();
response.Close();
Thread.Sleep(1000);
}
}
}
我尝试了这一部分:
if (InvokeRequired)
{
for (int f = 0; f < namesAndTexts.Count -1; f++)
{
BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
}
}
但是将列表不断地添加到textBox并不能很好地工作。 我希望在文本框中将其视为:
丹尼尔·哈罗
亚伦再见
丹尼·古德
而且只有一次。
另一件事是,如果在For im中不执行namesAndTexts.Count - 1
而是namesAndTexts.Count
则抛出异常错误namesAndTexts [f],即索引不应小于零,而小于列表。...
完成此工作后,我需要检查List是否已更改,并以某种方式自动向上推textBox,以便说用行将textBox填充到其大小,并在到达底部时开始向上滚动并仅更新新行从底部开始,将旧的从顶部向上推。
我该怎么做?
替换这些行:
for (int f = 0; f < namesAndTexts.Count -1; f++)
{
BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
}
用这些:
textBox1.Clear();
namesAndTexts.ForEach(Item=> textBox1.AppendText(Item + Environment.NewLine));
尝试将For循环放入Action lambda中。 另一种方法是先使用Sum LINQ函数对字符串求和,然后将结果放入文本框。
似乎您正在尝试在循环内以及实际执行以下代码时创建一个闭包:
textBox1.AppendText(namesAndTexts[f])
它将使用f
的当前值,而不是创建lambda时的当前值。 这就是为什么它一遍又一遍地添加最后一个元素的原因,并且如果您不使用namesAndTexts.Count - 1
则边界检查将失败(因为f
的当前值为namesAndTexts.Count
)。
另请参阅此问题 ,以获取有关“ closure inside loop”问题的更详细说明。 避免它的一种方法是通过复制f
变量:
for (int f = 0; f < namesAndTexts.Count; f++)
{
int fcopy = f;
BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[fcopy])), null);
}
由于这个原因,它在重复:
while (true)
{
reader.Close();
response.Close();
Thread.Sleep(1000);
}
}
}
另外,在此之前,您可以执行“ textBox1.Clear”:
for (int f = 0; f < namesAndTexts.Count -1; f++)
{
BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.