有没有办法将文本追加到ListBox的最后一行?我希望列表看起来像这样:
processing file 1... OK
processing file 2... CRC error
processing file 3... OK
当我打开文件进行处理时,我会用ListBox.Add(“处理文件x”)编写“处理文件x”。完成处理后,在继续下一个文件之前,我想附加处理结果。
我可以等到处理完成,然后立即写完整行,但处理文件可能需要10-15秒,这会让UI看起来没有响应。
解决方案还允许我附加文本(如完成%)或其他东西,以使UI在处理时更加活跃。我更喜欢使用ListBox,因为它的滚动和行选择属性,如果可能的话。
我找不到任何方法可以做到这一点;任何想法都会受到欢迎。
答案 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;