C# 如何动态更新列表框?
我正在制作一个搜索工具,并使用C# 如何动态更新列表框?,c#,.net,winforms,listbox,C#,.net,Winforms,Listbox,我正在制作一个搜索工具,并使用BackgroundWorker进行搜索。我希望,一旦找到第一个结果,就会打开一个新窗口,其中包含一个列表框,并显示第一个元素。现在,我希望一旦找到后续结果,ListBox应使用这些结果进行更新。 我想到的方法是在发现结果后立即报告进度,并将“新建”和“更新”作为userState传递给该方法。 根据用户状态,我可以决定是创建新的表单,还是更新现有表单。 以下是代码:- private void backgroundWorker1_ProgressChang
BackgroundWorker
进行搜索。我希望,一旦找到第一个结果,就会打开一个新窗口,其中包含一个列表框
,并显示第一个元素。现在,我希望一旦找到后续结果,ListBox
应使用这些结果进行更新。我想到的方法是在发现结果后立即报告进度,并将“新建”和“更新”作为
userState
传递给该方法。根据
用户状态
,我可以决定是创建新的表单
,还是更新现有表单。以下是代码:-
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.UserState.ToString() == "New")
{
Form ResultForm = new Form();
ResultForm.Name = "ResultForm" + i.ToString();
LastFormName = ResultForm.Name;
ListBox ResultListBox = new ListBox();
ResultListBox.DataSource = SearchList;
ResultListBox.Name = "ResultListBox" + i.ToString();
LastListName = ResultListBox.Name ;
ResultForm.Container.Add(ResultListBox);
ResultListBox.Show();
ResultForm.Show();
i++;
}
else
{
;
}
}
我已将上次打开的表单及其列表框的名称存储在变量LastFormName
和“LastListName”中。
我无法理解在else条件下放置什么,以便更新
列表框
您不应该在ProgressChanged
事件处理程序中执行工作
DoWork
事件处理程序很清楚,您应该在这里进行处理回答你的问题。由于在事件处理程序中创建了ListBox,因此它超出了
if
语句的范围。您需要在更全局的范围内创建它。然后添加到它ResultListBox.Items.add(“ResultListBox”+i.ToString())代码>我要做的是在弹出窗体上公开一些属性,这样您就可以知道它是否已打开并可以访问列表框
public partial class Popup : Form
{
public bool isOpen;
public ListBox PopupListBox;
public Popup()
{
InitializeComponent();
}
void Popup_FormClosing(object sender, FormClosingEventArgs e)
{
isOpen = false;
}
private void Popup_Load(object sender, EventArgs e)
{
this.FormClosing += Popup_FormClosing;
PopupListBox = popupListBox;
}
}
然后在调用表单上,我将订阅ProcessedChanged事件,并使用您正在通过ProcessedChangedEventArgs传递的数据更新列表框。这是呼叫表单的代码
public partial class Form1 : Form
{
Popup popupForm = new Popup();
BackgroundWorker backgroundWorker = new BackgroundWorker();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += backgroundWorkerDoWork;
backgroundWorker.ProgressChanged += backgroundWorkerProgressChanged;
backgroundWorker.RunWorkerCompleted += backgroundWorkerRunWorkerCompleted;
}
void backgroundWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
//What do you want to do if Cancelled?
}
else if (!(e.Error == null))
{
//What do you want to do if there is an error?
}
else
{
//What do you want to do when it is done?
}
}
void backgroundWorkerProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (!popupForm.isOpen || popupForm == null)
{
popupForm = new Popup();
popupForm.Show();
popupForm.isOpen = true;
}
else
{
popupForm.Activate();
popupForm.WindowState = FormWindowState.Normal;
}
popupForm.PopupListBox.Items.Add(e.ProgressPercentage.ToString() + "%");
}
void backgroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; (i <= 10); i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress((i * 10));
}
}
}
private void buttonStart_Click(object sender, EventArgs e)
{
if (backgroundWorker.IsBusy != true)
{
backgroundWorker.RunWorkerAsync();
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
if (backgroundWorker.WorkerSupportsCancellation == true)
{
backgroundWorker.CancelAsync();
}
}
}
公共部分类表单1:表单
{
Popup popupForm=新弹出窗口();
BackgroundWorker BackgroundWorker=新的BackgroundWorker();
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
backgroundWorker.WorkerSupportsScanCellation=true;
backgroundWorker.WorkerReportsProgress=true;
backgroundWorker.DoWork+=backgroundWorkerDoWork;
backgroundWorker.ProgressChanged+=backgroundWorkerProgressChanged;
backgroundWorker.RunWorkerCompleted+=backgroundWorkerRunWorkerCompleted;
}
void backgroundworkrrunworkercompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
如果((e.Cancelled==true))
{
//如果取消,您想做什么?
}
else如果(!(e.Error==null))
{
//如果出现错误,您想做什么?
}
其他的
{
//完成后你想做什么?
}
}
作废backgroundWorkerProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
如果(!popupForm.isOpen | | popupForm==null)
{
popupForm=新弹出窗口();
popupForm.Show();
popupForm.isOpen=true;
}
其他的
{
激活();
popupForm.WindowsState=FormWindowsState.Normal;
}
popupForm.PopupListBox.Items.Add(例如ProgressPercentage.ToString()+“%”);
}
无效BackgroundWorkerDowWork(对象发送方,DoWorkerVentargs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
对于(int i=1;(i)