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
事件处理程序中执行工作

  • 您将无法访问结果,因为它只传递了一个int表示进度和用户状态
  • 这是在UI线程上。整个要点是在后台线程上进行处理
  • 名称
    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)