Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ProgressBar для DataTable.WriteXml 
V
    Опции темы
RastaDja
Дата 25.2.2011, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Доброго времени суток!

Собственно:
Код

    DataTable m_Table = new DataTable();
    //   ... тра-та-та
    m_Table.WriteXml("C:\\Ptach.xml");


    Хотелось бы к m_Table.WriteXml("C:\\Ptach.xml"); привязать ProgressBar. smile .
    Если кто знает подскажите.
    Заранее благодарен за ответы.


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Gluttton
Дата 25.2.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 2
Всего: 54



RastaDja, рекомендую ознакомиться с BackgroundWorker'ом - в свое время сталкивался с подобной задачей и мне помогло.


--------------------
Слава Україні!
PM MAIL   Вверх
-Mikle-
Дата 25.2.2011, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



BackgroundWorker положит это сохранение в отдельный поток, но вы по-прежнему не сможете контролировать процесс хаписи в файл (хоть и будет возможность оповещать о нем). Предлагаю другое решение: создайте класс наследник от StreamWriter. Объявите событие и свойство типа Stream. В методе Write контролируйте сколько данных записалось, дергаете событие, ну и записывайте их в нижележащий поток. Вроде должно сработать.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
RastaDja
Дата 28.2.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Gluttton, а можеш свой код показать, там где с DataTable именно?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 28.2.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Помогите по возможности, я в с# только начал работать и не разобрался есчё, как из m_Table.WriteXml("C:\\Ptach.xml") возможно получить проценты от записи на диск я совсем не представляю. Объясните, ведь тема актуальна не только для меня. smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Gluttton
Дата 28.2.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 2
Всего: 54



Цитата(RastaDja @  28.2.2011,  10:49 Найти цитируемый пост)
Gluttton, а можеш свой код показать, там где с DataTable именно? 


Цитата(Gluttton @  25.2.2011,  17:16 Найти цитируемый пост)
RastaDja, рекомендую ознакомиться с BackgroundWorker'ом - в свое время сталкивался с подобной задачей и мне помогло. 


К сожалению в моей случае я "прикручивал" ProgressBar к запросу к БД.
Проценты выполнения были проставлены, мягко говоря... на абум (сформировал строку подключения - 10%, подготовил запрос с параметрами - 20%, ... , запрос к БД - Х%). Естественно ProgressBar двигался с нелинейной скоростью. В моем случае это была не проблема.

Цитата(RastaDja @  28.2.2011,  14:24 Найти цитируемый пост)
Помогите по возможности, я в с# только начал работать и не разобрался есчё, как из m_Table.WriteXml("C:\\Ptach.xml") возможно получить проценты от записи на диск я совсем не представляю. Объясните, ведь тема актуальна не только для меня.

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

В данном случае мне в голову приходят мысли вроде следующего:
1. Преобразуем xml в массив бит (это нам позволит узнать 100% предполагаемой "работы").
2. Массив бит передаем в файловый поток частями в цикле (это позволит нам узнавать актуальный % фактически выполненной "работы").
3. На каждой итерации проверяем переданный объем и в случае достижения очередного этапа сообщаем об этом ProgressBar'у.

Точнее скажут специалисты. Я в C# не силен...

Добавлено через 7 минут и 41 секунду
Цитата

ProgressBar для DataTable.WriteXml

Хм... Или я вообще не о том?


--------------------
Слава Україні!
PM MAIL   Вверх
gambit
Дата 28.2.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Мне почему то кажется, это не на столько длительный процесс, что бы прикручивать к нему прогрессБар и получить столько геморроя и ###кода. Максимум вынесете в отдельный поток, и приделайте прогрессбар лоадер без процентов, ну в котором полоска тупо бегает(там это каким то свойством выставляется).
PM MAIL ICQ Skype   Вверх
RastaDja
Дата 28.2.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(gambit @  28.2.2011,  16:36 Найти цитируемый пост)
Мне почему то кажется, это не на столько длительный процесс

вы действительно правы, но при 100 000 записей немного подвисает прога, + для пользователя удобно если ему сообщают что идет работа.

Цитата(gambit @  28.2.2011,  16:36 Найти цитируемый пост)
 Максимум вынесете в отдельный поток, и приделайте прогрессбар лоадер без процентов, ну в котором полоска тупо бегает(там это каким то свойством выставляется). 

Это такой отдельный компонент? или в прогресс баре выставляется какое-то свойство?

Добавлено через 4 минуты и 36 секунд
Цитата(RastaDja @  28.2.2011,  17:31 Найти цитируемый пост)
Это такой отдельный компонент? или в прогресс баре выставляется какое-то свойство?

Уже нашел  smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Gluttton
Дата 28.2.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 2
Всего: 54



Цитата(RastaDja @  28.2.2011,  17:31 Найти цитируемый пост)
для пользователя удобно если ему сообщают что идет работа.

Поставить StatusBar с текстом "Идет сохранение" и анимацию *.avi в виде пишущего карандашика или мигающей дискетки...


--------------------
Слава Україні!
PM MAIL   Вверх
-Mikle-
Дата 28.2.2011, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(RastaDja @  28.2.2011,  20:31 Найти цитируемый пост)
но при 100 000 записей немного подвисает прога

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


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
RastaDja
Дата 1.3.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(Gluttton @  28.2.2011,  17:48 Найти цитируемый пост)
Поставить StatusBar с текстом "Идет сохранение" и анимацию *.avi в виде пишущего карандашика или мигающей дискетки...


я вот написал как то так:
Код

toolStripProgressBar1.Visible = true;
m_dataTable.WriteXml("obraztsi.xml");
toolStripProgressBar1.Visible = false;


но ничего не произошло(ProgressBar не появился)
Цитата(-Mikle- @  28.2.2011,  20:23 Найти цитируемый пост)
Цитата(RastaDja @  28.2.2011,  20:31 )
но при 100 000 записей немного подвисает прога

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


В реальности столько записей скорее всего не будет, это я для себя пробовал


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 1.3.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Настряпал такое
1.  Установил свойство на панели проперти
       toolStripProgressBar1.Style = margue;
       toolStripProgressBar1.Visible = false;
       toolStripStatusLabel1.Text = ""; 
2.   Создаю поток
Код

private void button4_Click(object sender, EventArgs e)
{
      toolStripProgressBar1.Visible = true;         // показываем прогресс бар
      toolStripStatusLabel1.Text = "Сохранение"; 
      if (backgroundWorker1.IsBusy != true)//если поток не занят
      {
            backgroundWorker1.RunWorkerAsync();
      }
}

3.    Обрабатываю поток
Код

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
       BackgroundWorker worker = sender as BackgroundWorker;
       m_dataTableS.WriteXml("obraztsi.xml")
       e.Result = 0;//это не важно
}

4.    ждем завершения потока
Код

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
       toolStripProgressBar1.Visible = false;
       toolStripStatusLabel1.Text = "";
}


Вот так. Спассибо 
-Mikle-
Gluttton
gambit
за то что не бросили и помогли!!!


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Gluttton
Дата 1.3.2011, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 2
Всего: 54



RastaDja, сам молодец, что разобрался, а не сказал, что то типа: "... а набросайте мне пожалуйста решение, кому не сложно".

P.S.
Код

toolStripStatusLabel1.Text = "";

Я слышал, что правильнее писать вот так:
Код

toolStripStatusLabel1.Text = string.Empty;



--------------------
Слава Україні!
PM MAIL   Вверх
RastaDja
Дата 1.3.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(Gluttton @  1.3.2011,  10:57 Найти цитируемый пост)
Я слышал, что правильнее писать вот так:
код C#
1:
toolStripStatusLabel1.Text = string.Empty;

ОК исправлю


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.