Приложение C # WinForms - отладка ошибок с использованием OpenFileDialog, MultiSelect, Logging - PullRequest
0 голосов
/ 24 марта 2011

Справочная информация: я разрабатываю приложение WinForms с использованием C # с OpenFileDialog и FileBrowserDialog, которое должно:

  1. Включить выбор нескольких файлов xls.
  2. После того, как выбор сделан, Показать выбранные имена файлов xlsx в текстовом поле
  3. Скопировать выбранные файлы в отдельный каталог. Консолидированный
  4. Показать результаты в окне регистрации в нижней части приложения winForm

Как вы рекомендуете исправить любую из следующих ошибок при отладке:

  1. После выбора файлов из FileBrowserDialog появляется другое окно FileBrowserDialog
  2. Только 1 из выбранных файлов отображается в текстовом поле. Недостаточно места для отображения всех файлов, так как пути к файлам такие длинные. Можно ли будет просто отобразить имя файла без полного пути? Есть ли лучший способ подтверждения работы MultiSelect в WinForm, помимо отображения выбранных файлов в текстовом поле, которое вы рекомендуете?
  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 (строка FileName в sourceFilesList.FileNames) и элементом управления списком, все еще возникают проблемы при загрузке файлового браузера 2 раза, а также сообщение «Исходные файлы: System.String []»

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Ваш фрагмент кода не очень хорошо соответствует вашему вопросу, нет никаких признаков того, что вы отображаете 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);
   }
}
1 голос
/ 24 марта 2011

Чтобы получить только имя файла из пути к файлу, используйте Path.GetFileName (...).

Чтобы проверить, были ли выбраны несколько файлов, вы можете просто проверить свойство длины openFileDialog.FileNames - это массив.

0 голосов
/ 24 марта 2011

Исправлено сообщение окна логирования: «Исходные файлы: 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...