2009-05-24 6 views
4

私はC#の新機能です。私の上司はlistviewをファイルブラウザとして使用していくつかのコードを書いてくれと頼まれました。私はそれを試して、それは動作するようです。このコードは、ドライブからファイルを開き、listViewに表示することです。それはとても簡単です。また、listViewの表示項目をクリアできる追加機能も用意しました。私は、ディレクトリだけでなく、ファイルを開くことができる追加の機能を追加したいと思います。ところで は、ここに私のコードのサンプルです:リストビューのオープンディレクトリ

private void btnOpen_Click(object sender, EventArgs e) 
    { 
     string strSelectedPath; 

     folderBrowserDialog1.ShowDialog(); 
     strSelectedPath = folderBrowserDialog1.SelectedPath; 

     label1.Text = strSelectedPath; 



     DirectoryInfo di = new DirectoryInfo(strSelectedPath); 
     FileInfo[] files = di.GetFiles(); 

     foreach (FileInfo file in files) 
     { 
      listView1.Items.Add(file.Name); 
     } 
    } 

    private void btnClear_Click(object sender, EventArgs e) 
    { 

     listView1.Items.Clear(); 
     label1.Text=""; 
    } 

あなたはどのように私を示していただけますか?

答えて

5

あなたが質問を正しく理解している場合(選択したディレクトリ内のファイルだけでなくサブディレクトリも表示したい場合)、DirectoryInfoクラスのGetDirectoriesメソッドを調べることをお勧めします。

は、あなたはおそらく、このような何かを行うことができます:

DirectoryInfo di = new DirectoryInfo(strSelectedPath); 
// first list sub-directories 
DirectoryInfo[] dirs = di.GetDirectories(); 
foreach (DirectoryInfo dir in dirs) 
{ 
    listView1.Items.Add(dir.Name); 
} 
// then list the files 
FileInfo[] files = di.GetFiles(); 
foreach (FileInfo file in files) 
{ 
    listView1.Items.Add(file.Name); 
} 

更新:私はあなたがパス(ListDirectoryContents(string path)のようなもの)のための文字列パラメータを受け取り、別の方法に上記のコードを動かすことを示唆しています。この方法では、リストビューからアイテムを消去し、ラベルテキストを設定して、上のように新しいコンテンツを追加することから始められます。

このメソッドは、btnOpen_Clickメソッドから呼び出すことができ、folderBrowserDialog1.SelectedPathをpathパラメーターに渡します。

通常、私のイベントハンドラは可能な限り小さくしてください。実際の作業は実行しないでください。作業を行う他のメソッドを呼び出すことをお勧めします。これは、他の場所から同じ機能をトリガするためにもう少し多くを開きます。

たとえば、アプリケーションでパスをコマンドラインパラメータとして使用できるとすれば、コマンドラインからのパスにListDirectoryContentsを呼び出すだけで、フォームで同じ動作が繰り返されるよりも洗練されたコードになります。そのアプローチの

完全なコード例:このコードの

private void btnOpen_Click(object sender, EventArgs e) 
{ 
    string path = BrowseForFolder(); 
    if (path != string.Empty) 
    { 
     ListDirectoryContent(path); 
    } 
} 

private string BrowseForFolder() 
{ 
    FolderBrowserDialog fbd = new FolderBrowserDialog(); 
    if (fbd.ShowDialog() == DialogResult.OK) 
    { 
     return fbd.SelectedPath; 
    } 
    return string.Empty; 
} 

private void ListDirectoryContent(string path) 
{ 
    label1.Text = path; 
    listView1.Items.Clear(); 
    DirectoryInfo di = new DirectoryInfo(path); 
    // first list sub-directories 
    DirectoryInfo[] dirs = di.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     listView1.Items.Add(dir.Name); 
    } 
    // then list the files 
    FileInfo[] files = di.GetFiles(); 
    foreach (FileInfo file in files) 
    { 
     listView1.Items.Add(file.Name); 
    } 

} 

五分五分では、フォルダを参照する必要があるとき、それは単に選択されたパスを返していないので、あなたは、メソッドのBrowseForFolderを再利用することができるということですパスが使用される場所に接続されます。同様に、ListDirectoryContentメソッドは、pathパラメータがどこから来るのか全く知らない。それはフォルダブラウザから来るかもしれません、それはコマンドラインかどこからでも来るかもしれません。

「コアタスク」のみを実行するメソッドに焦点を当てる場合、必要な追加情報の入力パラメータに依存すると、再利用と保守が容易なコードが得られます。

イベントハンドラ(btnOpen_Clickなど)に関しては、それらをトリガとして見たいのですが、彼らは起こることを引き起こしますが、実際には多くのことをしません。

+0

私は、ListDirectoryContentに名前を割り当てただけですか?または別の名前を選択することはできますか? – tintincutes

0

DirectoryInfoクラスには、GetDirectoriesメソッドとGetFilesメソッドが含まれています。ディレクトリを追加するように変更された元のコードサンプルを参照してください。

private void btnOpen_Click(object sender, EventArgs e) 
{ 
    string strSelectedPath; 
    folderBrowserDialog1.ShowDialog(); 
    strSelectedPath = folderBrowserDialog1.SelectedPath; 
    label1.Text = strSelectedPath; 
    DirectoryInfo di = new DirectoryInfo(strSelectedPath); 
    FileInfo[] files = di.GetFiles(); 
    DirectoryInfo[] directories = di.GetDirectories(); 

    foreach (DirectoryInfo directory in directories) 
    { 
     listView1.Items.Add("Directory " + directory.Name); 
    } 
    foreach (FileInfo file in files) 
    { 
     listView1.Items.Add(file.Name); 
    } 
} 
+0

多くのファイルがある場合、***タスク***を使用している可能性がありますか? –

0

これはあなたが望むものだと思いますか?

DirectoryInfo[] directories = di.GetDirectories(); 
    foreach (DirectoryInfo directory in directories) 
    { 
     listView1.Items.Add(directory.Name); 
    } 
関連する問題