0

背景: OpenFileDialog と FileBrowserDialog を使用して C# を使用して WinForms アプリケーションを開発しています。

  1. 複数の xls ファイルの選択を有効にします。
  2. 選択後、選択したxlsxファイル名をテキストボックスに表示
  3. 選択したファイルを別のディレクトリにコピー 統合
  4. winForm アプリの下部にあるログ ウィンドウに結果を表示します。

デバッグで次のエラーを修正する方法をお勧めします:

  1. FileBrowserDialog からファイルを選択すると、別の FileBrowserDialog ボックスが表示されます
  2. 選択したファイルの 1 つだけがテキスト ボックスに表示されます。ファイル パスが長すぎるため、すべてのファイルを表示する十分なスペースがありません。フルパスなしでファイル名だけを表示することは可能でしょうか? 選択したファイルをテキストボックスに表示する以外に、WinForm で MultiSelect が機能していることを確認するためのより良い方法はありますか?
  3. [統合] ボタンをクリックしても、選択したファイルが統合ディレクトリにコピーされず、正しいログ ファイルが表示されません。
  4. ログウィンドウに次のように表示されます:「ソースファイル: System.String[]」

これが私のコードです:

private void sourceFiles_Click(object sender, EventArgs e)
{
    Stream myStream;
    int i = 0;
    OpenFileDialog sourceFilesList = new OpenFileDialog();

    this.sourceFileOpenFileDialog.InitialDirectory = "i:\\CommissisionReconciliation\\Review\\";
    this.sourceFileOpenFileDialog.Filter = "Excel Files (*.xls;*.xlsx;)|*.xls;*.xlsx;|All Files (*.*)|*.*";
    this.sourceFileOpenFileDialog.FilterIndex = 2;
    this.sourceFileOpenFileDialog.RestoreDirectory = true;
    this.sourceFileOpenFileDialog.Multiselect = true;
    this.sourceFileOpenFileDialog.Title = "Please Select Excel Source File(s) for Consolidation";

    if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
    {
        try
        {
            if ((myStream = sourceFileOpenFileDialog.OpenFile()) != null)
            {
                using (myStream)
                {
                     Log("Source Files: " + sourceFilesList.FileNames);
                }
            }       // ends if 
        }           // ends try 

    catch (Exception ex)
    {
        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
    }
  }              // ends if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
}                  // ends public void sourceFiles_Click

private void consolidateButton_Execute_Click(object sender, EventArgs e)
{

string consolidatedFolder = targetFolderBrowserDialog.SelectedPath; 

    foreach (String file in sourceFileOpenFileDialog.FileNames)
    {
        try
        {
            // Copy each selected xlsx files into the specified TargetFolder 

            System.IO.File.Copy(sourceFileOpenFileDialog.FileName, consolidatedFolder + @"\" + System.IO.Path.GetFileName(sourceFileOpenFileDialog.FileName));
            Log("File" + sourceFileOpenFileDialog.FileName + " has been copied to " + consolidatedFolder + @"\" + System.IO.Path.GetFileName(sourceFileOpenFileDialog.FileName));
        }  
    }          // ends foreach loop
  }           // ends void consolidateButton_Execute_Click

役立つ回答には +1 票を投じます!
ご覧いただきありがとうございます。

更新: foreach (sourceFilesList.FileNames 内の文字列 FileName) ループとリストボックス コントロールを使用してコードを更新しましたが、2x をロードするファイルブラウザーでまだ問題があり、「ソース ファイル: System.String[]」メッセージが表示されます。

4

3 に答える 3

1

あなたのコード スニペットはあなたの質問とうまく一致しません。FolderBrowserDialog を表示している兆候はありません。File.Copy() 呼び出しには明らかな間違いがあります。 fileの代わりに sourceFileOpenFileDialog.FileName を渡します。

限られたスペースにパス名を表示する方法については、この回答を確認してください。

 using System;
 using System.ComponentModel;
 using System.Windows.Forms;

 class PathLabel : Label 
 {
   [Browsable(false)]
   public override bool AutoSize 
   {
       get { return base.AutoSize; }
       set { base.AutoSize = false; }
   }
   protected override void OnPaint(PaintEventArgs e) 
   {
      TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.PathEllipsis;
      TextRenderer.DrawText(e.Graphics, this.Text, this.Font, this.ClientRectangle, this.ForeColor, flags);
   }
}
于 2011-03-24T15:09:04.423 に答える
1

ファイル パスからファイル名のみを取得するには、Path.GetFileName(...) を使用します。

複数のファイルが選択されているかどうかを確認するには、openFileDialog.FileNames の長さプロパティを確認します。これは配列です。

于 2011-03-24T15:07:30.227 に答える
0

以下を追加して、ログ ウィンドウ メッセージ: "Source Files: System.String[]" を修正しました。

                 foreach (string FileName in sourceFilesList.FileNames)
                 {
                    sourceFilesList.FileNames[i] = FileName;
                    listBoxSourceFiles.Items.Add(FileName);
                    Log("Source Files: " + sourceFilesList.FileNames[i]);
                    i++;
                 }

                 // under  if ((myStream = sourceFileOpenFileDialog.OpenFile()) != null)  

次の方法でファイルを選択すると、2 つの FileBrowserDialog ボックスが表示される問題を修正しました。

     if ((myStream = sourceFilesList.OpenFile()) != null)
     // deleted duplicate line 
于 2011-03-24T20:53:22.227 に答える