2016-04-09 5 views
-1

Я могу отображать элементы в списке, которые являются именами файлов из каталога. Недавно добавленные элементы не отображаются, пока программа не будет перекомпилирована. Я пробовал «ListBox.Refresh()», но это не сработало. Любые советы будут высоко ценится. СпасибоlistBox не отображает содержимое, пока программа не перекомпилирована C#

 InitializeComponentDirectoryInfo dir = new DirectoryInfo(".\\Notes\\"); 
     FileInfo[] files = dir.GetFiles("*.txt"); 
    foreach (FileInfo file in files) 
     { 
     listBox1.Items.Add(file); 
     } 
+0

Что вы имеете в виду с _Newly добавил items_? Являются ли эти новые элементы новыми файлами, созданными извне из вашей программы в папке Notes? – Steve

+0

Программа читает файл .TXT и копирует этот .TXT-файл в каталог Notes. Listbox отображает содержимое каталога Notes ... (надеюсь, что имеет смысл). – JonnyAppleseed

+0

Когда вы запускаете InitializeComponentDirectoryInfo? –

ответ

1

ListBox (и вообще ваша программа) не имеет способа узнать, добавляете ли вы новые файлы в каталог Notes. Эта информация известна только файловой системе. К счастью, NET Framework позволяет вашей программе получать уведомления об этих событиях, используя класс по имени FileSystemWatcher ....

Это пример того, как реализует какой-то контроль на системную папку с помощью экземпляра класса FileSystemWatcher

ListBox lb = new ListBox(); 

void Main() 
{ 
    FileSystemWatcher f = new FileSystemWatcher(@"d:\temp"); 
    f.NotifyFilter = NotifyFilters.FileName;  
    f.Created += new FileSystemEventHandler(watcher_Created);  
    f.EnableRaisingEvents = true; 

    Form fm = new Form(); 
    lb.Dock = DockStyle.Fill; 
    foreach(string file in Directory.EnumerateFiles(f.Path)) 
     lb.Items.Add(Path.GetFileName(file)); 
    fm.Controls.Add(lb); 
    fm.ShowDialog(); 
} 


private void watcher_Created(object source, FileSystemEventArgs e) 
{ 
    string newFile = e.Name; 
    if(!lb.Items.Contains(newFile)) 
     lb.Items.Add(newFile); 

} 

Обратите внимание, что я внесла некоторые изменения в исходный код. Если вам не нужен полный класс FileSystemInfo, тогда нет необходимости использовать этот класс, но более простого класса Directory достаточно, чтобы получить имена файлов. Затем цикл строится с использованием класса EnumerateFiles, который позволяет вашему коду заполнять список без заполнения перед массивом файлов.

(IE вы можете проверить этот код, используя LINQPad, не пытайтесь запустить его как на Visual Studio, он не будет работать)

Смежные вопросы