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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорение вывода данных в datagridview 
:(
    Опции темы
XavierElf
Дата 25.4.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Не знаю как решить проблему: имеется datagridview, который заполняется из dataset, проблема в том, что когда в datagridview заполняются тысяч десять рядов, при сортировке он начинает надолго задумываться... плюс к тому, для каждого ряда задаётся свой forecolor, который при сортировке сбрасывается... как можно ускорить сортировку и сделать так, чтобы после неё forecolor сохранялся?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Exception
Дата 25.4.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Боюсь, что с таким количеством строк он всегда будет долго грузиться.
PM   Вверх
6atoh
Дата 25.4.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 4



При таких больших обьемах данных советую всегда использовать Repeater. Ну и соответственно сортировку приходится ручками...
PM MAIL ICQ   Вверх
Exception
Дата 25.4.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Дык мы (если я правильно понял) про контрол Windows Forms.
PM   Вверх
6atoh
Дата 25.4.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 4



Ужос.....совсем заэспэнэтился smile 
PM MAIL ICQ   Вверх
XavierElf
Дата 26.4.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Мда... А нельзя данные загонять в промежуточный буфер для последующего вывода, а то у меня есть программа (правда исходников нет), которая также написана с помощью WinForms и в ней загрузка данных в гриду и сортировка происходят практически мгновенно, а строк загружается в гриду порядка 40000... Как такое возможно?  smile 
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
LuMee
Дата 26.4.2007, 10:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Данные всегда будут в промежуточном буфере, типа того же DataTable. Вообще, тут неплохо бы посмотреть код, возможно, тормозит как раз процесс заполнения DataTable'а, или кто у вас там гридвью данными кормит...
Как вариант, можно еще призадуматься - а зачем пользователю 10 тыс. строк на экране сразу? Возможно, следует наложить на данные какие-то доп. фильтры, или еще чего в этом роде?
PM MAIL   Вверх
XavierElf
Дата 26.4.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



В общем вот код чтения данных:
Код

                #region read data
                string textString;
                string[] splittextString;
                object[] newtextRow;
                StreamReader textSR = new StreamReader(TempDir + "\\text.txt");
                textString = textSR.ReadLine();
                textString = textSR.ReadLine();
                int i = 0;
                while (textString != null)
                {
                    splittextString = textString.Split(new Char[] { '\t' });
                    newtextRow = new object[splittextString.Length - 3];
                    newtextRow[0] = splittextString[0];
                    newtextRow[1] = splittextString[1];
                    newtextRow[2] = splittextString[2];
                    newtextRow[3] = splittextString[5] + splittextString[4] + splittextString[3];
                    textDGV.Rows.Add(newtextRow);
                    textDGV.Rows[i].DefaultCellStyle.ForeColor = Color.FromArgb(
                        int.Parse(splittextString[5], System.Globalization.NumberStyles.HexNumber), 
                        int.Parse(splittextString[4], System.Globalization.NumberStyles.HexNumber), 
                        int.Parse(splittextString[3], System.Globalization.NumberStyles.HexNumber));
                    textDGV.Rows[i].DefaultCellStyle.SelectionForeColor = Color.FromArgb(
                        int.Parse(splittextString[5], System.Globalization.NumberStyles.HexNumber), 
                        int.Parse(splittextString[4], System.Globalization.NumberStyles.HexNumber), 
                        int.Parse(splittextString[3], System.Globalization.NumberStyles.HexNumber));
                    textString = textSR.ReadLine();
                    i++;
                }
                textSR.Close();
                #endregion

Не знаю, как это лучше реализовать...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.4.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(LuMee @  26.4.2007,  10:06 Найти цитируемый пост)
Как вариант, можно еще призадуматься - а зачем пользователю 10 тыс. строк на экране сразу?

Согласен на 100%. Такой грид неудобно скроллировать и сложно найти то что требуется.


--------------------
user posted image
PM MAIL WWW   Вверх
XavierElf
Дата 28.4.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Хорошо, тогда как лучше разбить на страницы где-то по тысяче строк? И сделать сортировку не видимых строк а всех строк, которые имеются?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
mr.DUDA
Дата 29.4.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Запрос делать с указанием TOP COUNT, а для сортировки - ORDER BY.


--------------------
user posted image
PM MAIL WWW   Вверх
XavierElf
Дата 2.5.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Цитата(mr.DUDA @ 29.4.2007,  08:56)
Запрос делать с указанием TOP COUNT, а для сортировки - ORDER BY.

А если я данные беру не из базы а из файла? То есть у меня есть файл, определённой структуры. В нём разделители значений представлены табуляцией. Пробовал загружать из него сначала в датасет, потом из датасета в гриду, однако скорость была совсем уж страшной... Сделал напрямую вывод в гриду, однако всё равно не то...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
LuMee
Дата 3.5.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Думаю, с файлом тут быстро полюбому не получится. Ну разве что файл читать кусками: показать юзеру, скажем, 200 строк, потом по кнопке "Далее" - еще 200, ну в общем сделать что-то вроде постраничной разбивки.
Для пущего пафоса можно еще так извратиться: пусть первые 200 строк сразу заносятся в грид, а остальные тем временем в отдельном потоке засасываются в какой-нить List или DataTable, который затем задается в качестве DataSource гриду. Но тут уже надо будет хорошенько подумать, что да как.
Ну и наконец, может все-таки посмотреть в сторону какой-нибудь простенькой СУБД (типа SQLite или еще чего-нить такого встраиваемого)? С ней такие выкрутасы выкручивать будет попроще
PM MAIL   Вверх
XavierElf
Дата 3.5.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Цитата(LuMee @ 3.5.2007,  10:29)
Думаю, с файлом тут быстро полюбому не получится. Ну разве что файл читать кусками: показать юзеру, скажем, 200 строк, потом по кнопке "Далее" - еще 200, ну в общем сделать что-то вроде постраничной разбивки.
Для пущего пафоса можно еще так извратиться: пусть первые 200 строк сразу заносятся в грид, а остальные тем временем в отдельном потоке засасываются в какой-нить List или DataTable, который затем задается в качестве DataSource гриду. Но тут уже надо будет хорошенько подумать, что да как.
Ну и наконец, может все-таки посмотреть в сторону какой-нибудь простенькой СУБД (типа SQLite или еще чего-нить такого встраиваемого)? С ней такие выкрутасы выкручивать будет попроще

С базой уж точно нет смысла возиться... Дело в том, что с файлом, с которым я работаю, нужно провести следующие выкрутасы:
1) Декодировать
2) Дизасемблировать
3) Загрузить в гриду
4) В гриде изменить нужные куски файла
5) Сохранить в файл
6) Ассемблировать
7) Закодировать

ЗЫ. Чтобы не возникало никаких подозрений - я работаю над программой, которая работает со строковой информацией одной игры... Грубо говоря - для удобства локализации и т.п.  smile 
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
mr.DUDA
Дата 5.5.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



XavierElf, может проще заюзать готовый провайдер для текстовых файлов (CSV например) который встроен в .NET Framework ? Тогда и нормальные SQL-запросы можно делать.


--------------------
user posted image
PM MAIL WWW   Вверх
XavierElf
Дата 7.5.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Цитата(mr.DUDA @  5.5.2007,  18:47 Найти цитируемый пост)
XavierElf, может проще заюзать готовый провайдер для текстовых файлов (CSV например) который встроен в .NET Framework ? Тогда и нормальные SQL-запросы можно делать.

А поподробнее про это можно? А то я с CSV раньше не сталкивался. Какие классы следует использовать для этого?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
mr.DUDA
Дата 7.5.2007, 09:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



OleDbConnection, OleDbCommand для соединения и создания запроса; OleDbDataAdapter - для чтения и сохранения данных в датасет. Строку соединения для коннекшна можно посмотреть тут: www.connectionstrings.com


--------------------
user posted image
PM MAIL WWW   Вверх
XavierElf
Дата 7.5.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Я так понял, что разделитель колонок (delimiter) нужно указывать в реестре. А мне вообще не хочется использовать реестр. Есть ли возможность указывать разделитель в коде?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
mr.DUDA
Дата 7.5.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Можно подкинуть shema.ini рядом с файлом бд:
Цитата
Schema.ini

_
The schema information file tells the driver about the format of the text files. The file is always located in the same folder as the text files and must be named schema.ini.    
[customers.txt]
Format=TabDelimited
ColNameHeader=True
MaxScanRows=0
CharacterSet=ANSI

[orders.txt]
Format=Delimited(;)
ColNameHeader=True
MaxScanRows=0
CharacterSet=ANSI

[invoices.txt]
Format=FixedLength
ColNameHeader=False
Col1=FieldName1 Integer Width 15
Col2=FieldName2 Date Width 15
Col3=FieldName3 Char Width 40
Col4=FieldName4 Float Width 20
CharacterSet=ANSI



--------------------
user posted image
PM MAIL WWW   Вверх
XavierElf
Дата 22.5.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Так, я попробовал как ты написал, однако теперь проблема возникла с запросом... Как правильно строить запрос типа SELECT к нужному мне CSV файлу?
Пробовал так:
Код

                using (OleDbConnection connection = new OleDbConnection(
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + L2TempDir + 
                    ";Extended Properties=\"text;HDR=Yes;FMT=Delimited\";"))
                {
                    OleDbCommand command = new OleDbCommand(
                        "SELECT * " +
                        "FROM mycsvfile", connection);
                    connection.Open();
                    OleDbDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        MessageBox.Show(reader[0].ToString());
                    }
                }

выдаёт ошибку синтаксиса в предложении FROM...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

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


 




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


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

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