如何动态更新列表框?

时间:2013-12-18 03:01:33

标签: c# .net winforms listbox

我正在制作搜索工具并使用BackgroundWorker进行搜索。我希望一旦找到第一个结果,就会打开一个新窗口,其中ListBox显示第一个元素。现在,我希望在找到后续结果后,ListBox应该使用这些结果进行更新 我认为的方法是在找到结果后立即报告进度,并将“新”和“更新”作为userState传递给方法。
根据{{​​1}},我可以决定是创建新的userState还是更新现有的。{ 这是代码: -

Form

我在变量 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 { ; } } 和'LastListName'中存储了Last open Form和它的ListBox的名称。 我无法理解在else条件下放入什么内容,以便更新LastFormName

2 个答案:

答案 0 :(得分:2)

我要做的是在弹出窗体上公开一些属性,以便您可以判断它是否已打开并且可以访问列表框。

    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 :(得分:0)

您不应该在ProgressChanged事件处理程序

中工作
  1. 您将无法访问结果,因为它只传递了一个int用于进度和用户状态
  2. 这是在UI线程上。完整的一点是在后台线程上进行处理
  3. 名称DoWork事件处理程序很清楚,这是您应该进行处理的地方。
  4. 回答你的问题。由于您在事件处理程序中创建了ListBox,因此它超出了if语句之外的范围。您需要在更全局的范围内创建它。然后添加到ResultListBox.Items.Add("ResultListBox" + i.ToString());

相关问题