0

フォルダ ブラウザ ダイアログで選択されたディレクトリを再帰的に調べ、その中のすべてのファイルとすべてのサブ ディレクトリのインベントリを作成するプログラムを作成しました。ファイルごとにファイル オブジェクトを作成し、名前、パス、および作成日のプロパティを指定します。次に、それらをオブジェクト リストに追加して、並べ替えて csv として出力します。進行状況バーのようなものの代わりに、UI で検索を監視する機能を追加するように依頼されました。

私は WinForm UI の作成に非常に慣れていないため、どこから始めればよいか完全にはわかりません。作成された各ファイル オブジェクトの toolstripstatuslabel を更新する道を進んでいますが、それをどのように行うべきかわかりません。同様のタスクに BackgroundWorker を使用するための提案を読みましたが、これがこのプログラムが実行する唯一のタスクであるため、少しやり過ぎのように思えます。イベントハンドラー/デリゲートを使用する必要があると考えていますが、実装方法が完全にはわかりません。

役立つコードを投稿してうれしいです。ありがとう。

4

2 に答える 2

1

再帰検索を含むクラスにイベント ハンドラーを追加することで、最終的にこれを実現することができました。ディレクトリ内の各ファイルのファイル オブジェクトの名前を設定するときに、onPropertyChanged イベントを設定します。これを、バックグラウンド ワーカーの DoWork のフォームに結び付けました。次に、イベントがトリガーされたときに進行状況を報告し、バックグラウンド ワーカーの ProgressChanged を使用してテキストを現在のファイル名に設定しました。似たようなことをしようとしている人を助けるために、私のプログラムからいくつかのコード スニペットを示します。

検索クラスで

foreach (string file in Directory.GetFiles(dir))
    {
       //creating objects for each file in the directory
       FileObject fileObject = new FileObject();
       FileInfo info = new FileInfo(file);
       currentfile = file.ToString();
       fileObject.name = info.Name.ToString();
       fileObject.path = file.ToString();
       fileObject.createdDate = info.CreationTime.ToString();
       FileList.Add(fileObject);
       //event handler triggered
       OnFileNameChanged(name);
    }

//event handler code
public event PropertyChangedEventHandler PropertyChanged;

protected void OnFileNameChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }

ウィンドウフォームで

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
       //do some work
      search.PropertyChanged += (s, pe) => backgroundWorker1.ReportProgress(unusedNumber);
      backgroundWorker1.ReportProgress(100);
    }
 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      //change label
      label1.Text = search.currentfile;
    }
于 2013-03-12T13:09:02.890 に答える
0

はい、UI を「クリック可能」にしたくない場合は、解決策としてイベントを使用できます。再帰コードはイベントを提供する必要があり、UI はそれをサブスクライブできます。イベント ハンドラは必要なデータを取得し、フォームを再描画します。しかし、通常、それは良いアプローチではありません。UIスレッドがタスクでビジーであるため、フォームを操作できず、ユーザーフレンドリーな方法で(プロセスを強制終了せずに)タスクを中止できません。

于 2013-03-07T17:17:59.840 に答える