列表框更新#2

J13*_*t0u 2 c# listbox winforms

我正在尝试用C#更新这个Listbox.这是我在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();
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Jas*_*own 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();
}
Run Code Online (Sandbox Code Playgroud)

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


更新:

我可能会从表单中提取您的进程相关代码并将其放在另一个类中.然后用a创建一个属性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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的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();
    }
}
Run Code Online (Sandbox Code Playgroud)