Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Чтение из файла в ListBox


Автор: Incvizitor 11.3.2009, 23:54
Доброго времени суток!

Сижу весь вечер над ListBox-ом и пытаюсь правильно считать в него строки из файла file.txt вот что напечатал:

Код

        public void readFile()
        {
            file = new FileInfo("file.txt");
            fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
            sr = new StreamReader(fs);

            string line = sr.ReadLine();

            listBox1.Items.Clear();

            while (line != null)
            {
                listBox1.Items.Add(line);
                line = sr.ReadLine();
            }
        }


Эта конструкция выводит все из файла, но readFile() дергаю FileSystemWatcher-ом, вот тут то и "косяк". file.txt время от времени пополняется новыми строчками, FileSystemWatcher срабатывает, дергает readFile() и при этом выводит опять все строчки, а нужно только то, что добавилось. Я не представляю как это делается, так что обращаюсь за помощью к специалистам. Я уже думал, что нужно как-то подсчитать количество строк в listBox1.Items, далее проверяем файл, изначально пропуская количество строк полученных в listBox1.Items и если там появилась строка или несколько, то добавить к тем что мы уже вывели. Но как это все реализовывается я не знаю :(

Буду очень рад за хороший примерчик. Спасибо!

Автор: lam0x7C4 12.3.2009, 00:27
хм... если добавлять только новые строки, то вот: 
      
Код

  public void readFile ( )
        {
            file = new FileInfo ( "file.txt" );
            using ( fs = file.Open ( FileMode.Open, FileAccess.Read, FileShare.Read ) )
            {
                using ( sr = new StreamReader ( fs ) )
                {
                    // можна так: добавление только новых строк
                    // пропускаем первые n строк.
                    int n = listBox1.Items.Count;

                    int i = 0;

                    string line;
                    while ( ( line = sr.ReadLine ( ) ) != null )
                    {
                        i++;
                        if ( i > n )
                            listBox1.Items.Add ( line );
                    }

                    // а можна и так:
                    // ведь строчки могут добавиться и в начало файла, и в середину:)
                    // так что, имхо, лучше перечитать заново
listBox1.Items.Clear();                   
string line;
                    while ( ( line = sr.ReadLine ( ) ) != null )
                    { 
                            listBox1.Items.Add ( line );
                    }
                }
            }
        }


но все-таки надежней просто чистить листбокс, а читать в него весь файл, т.е. так как ты и написал. По производительности это не должно ударить, т.к. насколько я понимаю, речь не идет о больших объемах данных(в листбокс ведь сильно много данных и зачитаешьsmile ) 

Автор: Incvizitor 12.3.2009, 01:01
Спасибо большое, все как нужно! Хотел вам плюс поставить, но форум говорит:

Цитата

Обнаружена ошибка:

У Вас недостаточно постов, чтобы изменять репутацию пользователей. Необходимо 100 постов.

Так что только спасибо.

Автор: Incvizitor 12.3.2009, 08:10
Доброго времени суток!

Простите за наглость, но не кинете в меня куском кода с реализацией автопрокрутки ListBox-а. Вопрос не очень важен, это так, может кто-то делал и знает smile Я уже не помню, но видел когда-то программу, там тоже выводились данные с обновлением строк (постоянно дописывались новые), так вот, если кликнуть на форму (в заголовок или любое пустое место), то запускалась автопрокрутка, то есть список автоматически прокручивался до последней строки, а если выделить сам список, то прокрутка останавливалась и можно было самому перемещаться по всему списку с помощью скрола. Не знаю, получилось ли объяснить, но я старался smile Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)