将文本附加到列表框中的一行

时间:2016-05-11 18:25:39

标签: c# listbox

有没有办法将文本追加到ListBox的最后一行?我希望列表看起来像这样:

processing file 1...  OK
processing file 2...  CRC error
processing file 3...  OK

当我打开文件进行处理时,我会用ListBox.Add(“处理文件x”)编写“处理文件x”。完成处理后,在继续下一个文件之前,我想附加处理结果。

我可以等到处理完成,然后立即写完整行,但处理文件可能需要10-15秒,这会让UI看起来没有响应。

解决方案还允许我附加文本(如完成%)或其他东西,以使UI在处理时更加活跃。我更喜欢使用ListBox,因为它的滚动和行选择属性,如果可能的话。

我找不到任何方法可以做到这一点;任何想法都会受到欢迎。

3 个答案:

答案 0 :(得分:2)

您可以直接将项目添加到列表框

 listBox1.Items.Add("new item");

你可能需要刷新它

listBox1.Refresh(); 

编辑:

如果您想要更新最后一项,则需要删除最后一项,然后重新添加

var lastItem= listBox1.Items[listBox1.Items.Count-1];
lastItem += results;
listBox1.Items.RemoveAt(listBox1.Items.Count-1);
listBox1.Add(lastItem);

答案 1 :(得分:0)

您的问题是GUI事件在与GUI呈现相同的线程上处理,因此UI将一直没有响应,直到完成为止。

快速而苛刻的解决方案是在每次ListBox.Add调用后调用Application.DoEvents()。如果您尝试拖动它,表单仍然会抖动,但该功能将导致GUI更新/渲染一次。

正确的方法是使用BackgroundWorker,您可以从GUI事件开始,并在后台处理单独的线程。如果实现其ProgressChanged函数,可以从DoWork中调用它:

listBox.Add(e.UserState.ToString() + ", " + e.ProgressPercentage.ToString() + "% completed.")

然后在ProgressChanged中,做你的全部:

/// <reference path="../module.ts"/>

module BalancingApp.App.Directives {
    angular.module('balancingApp')
    .directive('wbProject', function() {
        return {
            template: "<p>Projectdetails</p>"
        };
    })
    ;
}

答案 2 :(得分:0)

简单版本:

$categories = Category::with('articles.comments')->get();

或者,为获得更完整的解决方案(可从非UI线程使用):

var i = listBox.Items.Count - 1;  // crash bug if there is no line to append to
listBox.Items[i] = listBox.Items[i] + message;