繁体   English   中英

如何添加列表中的所有字符串 <string> 到文本框?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM