我希望我的后台工作者将项目添加到列表框中,它在调试时似乎这样做但列表框没有显示值。我怀疑这与在后台工作线程中添加项目有关,我是否需要将这些添加到数组中,然后在backgroundWorker1_RunWorkerCompleted
期间从数组中填充列表框?
感谢您的帮助。
答案 0 :(得分:13)
您可以像这样使用Invoke:
private void AddToListBox(object oo)
{
Invoke(new MethodInvoker(
delegate { listBox.Items.Add(oo); }
));
}
答案 1 :(得分:6)
您可以,但您必须建议您的Backgroundworker报告状态,并将包含当前状态的框的输入发送到该事件。在该事件的方法中,您可以访问该框并将新值放入。
否则你需要手动调用。
public Form1()
{
InitializeComponent();
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
((BackgroundWorker)sender).ReportProgress(0, i.ToString());
}
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBox1.Items.Add((string)e.UserState);
}
答案 2 :(得分:1)
您可以在后台线程中通过以下方式添加它们:
Form.Invoke
或
Form.BeginInvoke
需要将调用从后台线程编组到主UI线程。 但是我很确定BackgroundWorker提供了一个在Foreground线程上自动调用的事件,你应该可以在没有任何问题的情况下更新这个事件。 这是“ProgressChanged”,可以通过调用ReportProgress由后台工作进程触发。
您是否尝试过在列表框中调用.Refresh()
?
答案 3 :(得分:1)
我添加了如下所示的函数,以便我可以从主线程或后台线程向列表框添加项目。 Thi线程检查是否需要Invoke,然后在必要时使用Invoke。
delegate void AddListItemDelegate(string name,object otherInfoNeeded);
private void
AddListItem(
string name,
object otherInfoNeeded
)
{
if (InvokeRequired)
{
BeginInvoke(new AddListItemDelegate(AddListItem), name, otherInfoNeeded
return;
}
... add code to create list box item and insert in list here ...
}
答案 4 :(得分:1)
如果您尝试更新数据库。从列表框中我建议创建一个数据集。
例如,如果您为数据库中的每个项目执行某些操作。通过创建新数据集并通过mainDataset声明来复制数据库数据集。例如: // gridview数据集是dataset1
BackgroundWorker_DoWork(object sender, DoWorkArgs e)
{
Dataset dataset2 = dataset1;
foreach(DataGridViewRow row in GridView)
{
//do some work
dataset2.Main.AddMainRow(values to add);
dataset2.AcceptChanges();
}
}
BackgroundWorker_WorkCompleted(object sender, DoWorkArgs e)
{
//Forces UI thread to valitdate dataset
dataset2.update();
// Sets file Path
string FilePath = "Some Path to file";
dataset2.writexml(FilePath, XmlWriteOptions.WriteSchema);
//if you use xml to fill your dataset filepath to write should equal path to dataset1 xml
dataset1.Refresh();
}
答案 5 :(得分:0)
Application.Doevents()
函数将解决问题。