2010-06-22 4 views
1

У меня так много проблем с моим проектом, я действительно не знаю с чего начать. Во-первых, я получаю сообщение об ошибке «ссылка на объект требуется для нестатического поля, метода или свойства». Он подчеркивает retPath (строка: DriveRecursion_results.DriveRecursion (retPath);). Я не знаю, как это исправить.Проблемы с ListView & File Output

Другое, что я все еще в тупике, это как заполнить список в моей Windows Form. Я хочу список файлов, которые нужно переименовать (по сравнению со списком всех файлов в моем списке.)

Может кто-нибудь помочь? Я уже несколько часов борется с этим.

Вот мой код:

Form1.cs:

namespace FileMigration 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     FolderSelect("Please select:"); 
    } 
    public string FolderSelect(string txtPrompt) 
    { 
     //Value to be returned 
     string result = string.Empty; 

     //Now, we want to use the path information to population our folder selection initial location 
     string initialCheckoutPathDir = (@"C:\"); 
     System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(initialCheckoutPathDir); 
     FolderBrowserDialog FolderSelect = new FolderBrowserDialog(); 
     FolderSelect.SelectedPath = info.FullName; 
     FolderSelect.Description = txtPrompt; 
     FolderSelect.ShowNewFolderButton = true; 

     if (FolderSelect.ShowDialog() == DialogResult.OK) 
     { 
      string retPath = FolderSelect.SelectedPath; 
      if (retPath == null) 
      { 
       retPath = ""; 
       } 
      DriveRecursion_Results ds = new DriveRecursion_Results(); 
      ds(retPath); 
      result = retPath; 
      //Close this form. 

     } 
     return result; 
    } 



    } 
} 

Здесь вы DriveRecursion_Results.cs:

namespace FileMigration 
{ 
public partial class DriveRecursion_Results : Form 
{ 
    public DriveRecursion_Results() 
    { 
     InitializeComponent(); 
    } 

    private void fileOutput_SelectedIndexChanged(object sender, EventArgs e) 
    { 

    } 
    public void DriveRecursion(string retPath) 
    { 

     // string[] files = Directory.GetFiles(retPath, "*.*", SearchOption.AllDirectories); 

     string pattern = " *[\\~#%&*{}/<>?|\"-]+ *"; 
     string replacement = ""; 
     Regex regEx = new Regex(pattern); 

     string[] fileDrive = Directory.GetFiles(retPath, "*.*", SearchOption.AllDirectories); 
     List<string> filePath = new List<string>(); 

     foreach (string fileNames in fileDrive) 
     { 
      if (regEx.IsMatch(fileNames)) 
      { 
       filePath.Add(fileNames); 
       //I tried adding my listview (fileOptions) here but I cannot for some reason 
      } 
     } 

     } 





     } 




    } 

Любая помощь будет действительно оценили :(Кто-нибудь есть какие-либо идеи о том, как изменить мой код, чтобы он действительно работал?

+0

EDITED: теперь оба метода нестационарны и позаботились об ошибке, полученной с помощью retPath. Тем не менее, у кого-нибудь есть идеи для проблемы №2 с отображением списка, вывод только из файлов, которые нужно переименовать? – yeahumok

+0

Какой код вы уже пробовали для добавления элементов в список? Теперь, когда метод не является статическим, вы должны просто вызвать ListView.Items.Add («Item»); –

+0

Я сделал это - однако, когда я запускал свое приложение, я только получил диалог для выбора диска и папки и НЕ списка. это b/c, я ничего не помещал в private void fileOutput_SelectedIndexChanged (отправитель объекта, EventArgs e)? Если это так, то что мне нужно добавить туда, чтобы убедиться, что мое приложение знает, чтобы отобразить список с выходом файлов, которые нужно изменить? – yeahumok

ответ

0

Вы не можете добавлять элементы в свой список, потому что вы пытаетесь добавить их из статического метода.

Поскольку он не является статическим, нет ListView, потому что на самом деле нет Form, чтобы добавить вещи. Вам нужно будет сделать DriveRecursion() не статическим, чтобы добавить вещи в ListView.

Кроме того, когда вы делаете DriveRecursion() не статичным, вам понадобится способ, чтобы Form1 знал, какой класс DriveRecursion_Results заполнить.

Другой подход, который вы могли бы предпринять, - Form1 возвращение retPath - DriveRecursion_Results.

Редактировать

Удалены несущественные части моего оригинального ответа

Я скопировал свой код в точности так, как оно было отправлено. А затем внесла следующие изменения в FolderSelect() в Form1.cs Когда я запустил этот код. Я могу открыть второе окно, но не закрыть другое окно, потому что это заставит приложение выйти.

Пожалуйста, убедитесь, что у вас есть ds.Show() и сделать в какой-то точке вызова ds.DriveRecursion (RETPATH)

Модифицированный FolderSelect (строка) в Form1.cs:

private void FolderSelect(string txtPrompt) 
    { 
     //Value to be returned 
     string result = string.Empty; 

     //Now, we want to use the path information to population our folder selection initial location 
     string initialCheckoutPathDir = ("C:\\"); 
     System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(initialCheckoutPathDir); 
     FolderBrowserDialog FolderSelect = new FolderBrowserDialog(); 
     FolderSelect.SelectedPath = info.FullName; 
     FolderSelect.Description = txtPrompt; 
     FolderSelect.ShowNewFolderButton = true; 

     if(FolderSelect.ShowDialog() == DialogResult.OK) 
     { 
      string retPath = FolderSelect.SelectedPath; 
      if(retPath == null) 
      { 
       retPath = ""; 
      } 
      DriveRecursion_Results ds = new DriveRecursion_Results(); 
      ds.DriveRecursion(retPath); 
      ds.Show(); 
      result = retPath; 
      //Close this form. 

     } 
     return; 
    } 
+0

У меня все еще возникает проблема с закрытием моего начального Form1. после того, как пользователь нажимает «ok» на filebrowserdialog, форма закрывается и переходит к следующей форме (список файлов, подлежащих переименованию). – yeahumok

+0

Я предполагаю, что вы сталкиваетесь с той же проблемой, я пытаюсь закрыть форму с этим.Close() - что все приложение завершает работу. Это связано с тем, что форма, которая запустила приложение Form1, теперь закрыта, поэтому приложение завершает работу, прежде чем вы получите шанс на s ee DriveRecursion_Results. Через несколько секунд я опубликую правку. –

+0

На самом деле мое приложение не закрывается - ничего не закрывается. Form1 не закрывается (форма, содержащая единственную кнопку, которую пользователь нажимает, чтобы вызвать FileBrowserDialog). Кажется, ничего не происходит даже после того, как пользователь выполнил выбор диска и папки, которые они хотят, чтобы приложение развернулось. – yeahumok

2

Вопрос 1: ваша функция stati с. Если он перестанет быть таким, это будет работать. Это связано с тем, что статическая функция не имеет этого скрытого «этого» аргумента - ссылки на объект, на который он воздействует. Таким образом, он может получить доступ только к элементам статических данных, а не к обычным.

+0

я избавился от статики - поэтому оба метода теперь нестатические. тем не менее, я все еще получаю «ссылка на объект требуется для нестатического поля, метода или свойства) в одном и том же месте – yeahumok

+1

Я предполагаю, что вы оставили остальную часть кода, так что у вас все еще есть DriveRecursion_Result.DriveRecursion (retPath). Теперь вам понадобится конкретный DriveRecursion_Result для вызова DriveRecursion. Вам нужно будет иметь экземпляр класса DriveRecursion_Result и вызвать на нем DriveRecursion. –

2

Вы не можете добавить элементы в свой список из этого уровня, потому что listview не статичен, а метод DriveRecursion статичен. Я бы начал с изменения метода DriveRecursion для нестатического или возврата списка путей к файлу.