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を試しましたが、使用できません。1つの質問は、リストボックスを更新するにはどうすればよいですか?私はそれを達成する方法を理解することはできません。

私もこれを正しくやっていますか?List.Items.AddRange(getList());である必要があります。progHider_Loadメソッドに含まれていますか?もう1つの質問は、private void progHider_Load(object sender、EventArgs e)はどのように機能するかということです。一度だけ使用しますか?あなたはそれを呼ぶことができますか?また、メインメソッドはどこにありますか?Visual Studio 2010 Windowsアプリケーションモードを使用していますが、部分クラスのコードが表示されるだけです。

4

2 に答える 2

5

私はそれをまったく異なる方法で行いますが、あなたが持っているものに合わせて、これらの2つのメソッドを私がここに持っているものに変更します(ListListBoxオブジェクトの名前であると仮定します):

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();
    }
}
于 2012-07-17T01:27:41.677 に答える
0

List.Items.AddRange(getList());を呼び出す必要がある場合でも、ボタンをクリックすると表示されます。

あなたの例の目的のために、あなたはprogHider_Load ..を呼び出すことができますが、私の意見では、イベントハンドラーを呼び出すことはダーティプールです

于 2012-07-17T01:22:45.283 に答える