C#WinForms应用程序 - 使用OpenFileDialog,MultiSelect,Logging调试错误

时间:2011-03-24 14:57:33

标签: c# logging error-handling openfiledialog fileopendialog

背景:我正在使用C#开发一个WinForms应用程序,其中包含一个OpenFileDialog和FileBrowserDialog:

  1. 启用多个xls文件的选择。
  2. 选择后,在文本框中显示选定的xlsx文件名
  3. 将所选文件复制到单独的目录Consolidated
  4. 在winForm应用程序底部的日志记录窗口中显示结果
  5. 您如何建议在调试中修复以下任何错误:

    1. 从FileBrowserDialog中选择文件后,会出现另一个FileBrowserDialog框
    2. 所选文件中只有一个显示在文本框中。没有足够的空间来显示所有文件b / c文件路径如此之长。是否可以只显示没有完整路径的文件名?除了在您推荐的文本框中显示所选文件之外,还有更好的方法来确认MultiSelect在WinForm中工作吗?
    3. 点击“合并”按钮不会将所选文件复制到统一目录或显示正确的日志文件。
    4. 我在日志记录窗口中收到以下内容:“源文件:System.String []”
    5. 这是我的代码:

      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票! 谢谢你的期待!

      更新:更新了代码w / foreach(sourceFilesList.FileNames中的字符串FileName)循环和一个列表框控件,仍有问题w / filebrowser加载2x,以及“Source Files:System.String []”消息

3 个答案:

答案 0 :(得分:1)

要仅从文件路径获取文件名,请使用Path.GetFileName(...)。

要检查是否选择了多个文件,您只需检查openFileDialog.FileNames Length属性 - 它是一个数组。

答案 1 :(得分:1)

您的代码段与您的问题不太匹配,没有显示FolderBrowserDialog的迹象。 File.Copy()调用中存在明显错误,您传递sourceFileOpenFileDialog.FileName而不是 file

检查this answer以查看在有限空间内显示路径名的方法:

 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);
   }
}

答案 2 :(得分:0)

修复了日志记录窗口消息:“源文件: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