列表框更新#2

时间:2012-07-17 00:43:45

标签: c# winforms listbox

我正在尝试在C#中更新此列表框。这是我在C#中的第一个程序,不完全确定它是如何工作的。

public partial class progHider : Form
{
    String[] processList;

    public progHider()
    {
        InitializeComponent();
    }

    private void progHider_Load(object sender, EventArgs e)
    {
        List.Items.AddRange(getList());
    }

    private String[] getList()
    {
        Process[] processlist = Process.GetProcesses();
        processList = new String[Process.GetProcesses().Length];
        int index = 0;
        foreach (Process process in processlist)
        {
            if (!String.IsNullOrEmpty(process.MainWindowTitle))
            {
                processList[index] = process.MainWindowTitle;
                index++;
            }
        }

        return processList;
    }

    private void btnrefresh_Click(object sender, EventArgs e)
    {
        List.DataSource = null;
        this.Update();
    }

因此刷新按钮假设通过调用getList()来更新Listbox,但我不知道如何完成它。在java中,您只需要调用该方法并执行repaint()。我试过这个。刷新/更新,没用。 一个问题是如何更新Listbox?我无法弄清楚如何实现它。

我甚至做得对吗?应该List.Items.AddRange(getList());在progHider_Load方法? 另一个问题是,private void progHider_Load(对象发送者,EventArgs e)如何工作?它只用过一次吗?你能打电话吗? 另外,Main方法在哪里?我正在使用Visual Studio 2010的Windows应用程序模式,它只显示了部分类的代码。

2 个答案:

答案 0 :(得分:5)

我会以完全不同的方式做到这一点,但是为了与你所拥有的一致,将这两个方法更改为我在这里的方法(假设List是ListBox对象的名称):

private void progHider_Load(object sender, EventArgs e)
{
    List.DataSource = getList();
}

private void btnrefresh_Click(object sender, EventArgs e)
{
    List.DataSource = getList();
}

并回答你的问题。首次加载表单时会调用progHider_Load事件。你不应该明确地调用它(虽然如果你真的想要没有什么能阻止你)。


<强>更新

我可能会将与您的流程相关的代码从表单中提取出来并将其放在另一个类中。然后使用BindingList<String>创建一个属性(对于WinForms ...或者如果您使用WPF,则可能使用ObservableCollection<String>)。这是一个示例类:

using System;
using System.ComponentModel;
using System.Diagnostics;

public class ProcessListGenerator
{
    public ProcessListGenerator()
    {
        ProcessList = new BindingList<String>();
    }

    public BindingList<String> ProcessList
    {
        get;
        private set;
    }

    public void UpdateProcessList()
    {
        ProcessList.Clear();
        foreach (var proc in Process.GetProcesses()
                                    .Where(p => !String.IsNullOrEmpty(p.MainWindowTitle)))
        {
            ProcessList.Add(proc.MainWindowTitle);
        }
    }

在您的progHider表单中,您可以拥有:

public partial class progHider : Form
{
    ProcessListGenerator _processes;

    public progHider()
    {
        InitializeComponent();
    }

    private void progHider_Load(object sender, EventArgs e)
    {
        _processes = new ProcessListGenerator();
        _processes.UpdateProcessList();
        listBox1.DataSource = _processes.ProcessList;
    }

    private void btnRefresh_Click(object sender, EventArgs e)
    {
        _processes.UpdateProcessList();
    }
}

答案 1 :(得分:0)

即使你需要调用List.Items.AddRange(getList());它看起来你的按钮点击;

出于示例的目的,您可以调用progHider_Load ..但在我的opnion中调用事件处理程序是脏池