2012-07-17 90 views
2

我想在C#中更新此列表框。这是我在C#中的第一个程序,不完全确定事情是如何工作的。listbox更新#2

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()。我试过这个.refresh/update,没用。 一个问题是如何更新Listbox?我无法弄清楚如何完成它。

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

回答

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事件被调用。你不应该明确地调用它(尽管如果你真的想要阻止你的话)。


UPDATE:

我可能会拉你的过程相关的代码的表格,并把它放在另一个类。然后用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(); 
    } 
} 
+0

谢谢。有效!但你会如何做不同? – J13t0u 2012-07-17 01:32:29

+0

@ J13t0u:我添加了一个可能的方法的例子,根据我对自己想要做的事情的有限了解。使用'BindingList '可以在列表更改时自动更新。此外,拉出名单人口的逻辑有助于遵循单一责任原则(又称分离担忧)。 – 2012-07-17 02:17:23

0

即使您需要调用List.Items.AddRange(getList()),它也会显示在您的按钮上。

您的例子的目的,你可以调用progHider_Load ..但在我opnion调用的事件处理程序是肮脏的水池