2

我正在尝试在 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() 来更新列表框,但我不知道如何完成它。在java中,您只需要调用该方法并执行repaint()。我试过this.refresh/update,没用。一个问题是如何更新列表框?我不知道如何实现它。

我这样做对吗?应该 List.Items.AddRange(getList()); 在 progHider_Load 方法中?另一个问题是,private void progHider_Load(object sender, EventArgs e) 是如何工作的?它只使用一次吗?你能叫它吗?另外,Main方法在哪里?我正在使用 Visual Studio 2010 windows 应用程序模式,它只是向我显示了部分类的代码。

4

2 回答 2

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 事件在表单首次加载时被调用。你不应该明确地调用它(尽管如果你真的想的话,没有什么能阻止你)。


更新:

我可能会将您的流程相关代码从表单中提取出来并将其放在另一个类中。然后使用 a 创建一个属性BindingList<String>(对于 WinForms... 或者如果您使用的是 WPF,您可能会使用 a 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();
    }
}
于 2012-07-17T01:27:41.677 回答
0

即使您需要调用 List.Items.AddRange(getList()); 它也会显示您的按钮单击

就您的示例而言,您可以调用 progHider_Load.. 但在我看来,调用事件处理程序是脏池

于 2012-07-17T01:22:45.283 回答