powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заполнение DataGrid(как сделать быстрее)
25 сообщений из 27, страница 1 из 2
Заполнение DataGrid(как сделать быстрее)
    #32544060
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот небольшой участок кода общее время заполнение Grida при 100 записях
в результатах запроса 10 секунд,мне кажется что это сильно долго,причем сам запрос выполняется моментально а вот заполнение строк в таблице самый продолжительный этап,выполняется это на Pocket PC,может кто -нибудь подскажет как можно оптимизировать.
private void button6_Click(object sender, System.EventArgs e)
{
DataTable myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow;
DataView myDataView;

myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
//*******************************
SqlCeConnection conn = null;
conn = new SqlCeConnection ("Data Source = \\SDMMC Disk\\Test.sdf");
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();
//MessageBox.Show(myDataTable.Rows.Count.ToString());
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[0] = rdr.GetSqlString(0).ToString();
myRow[1] = rdr.GetSqlString(1).ToString();
myRow[2]=rdr.GetSqlString(2).ToString();
myDataTable.Rows.Add(myRow);

}
myDataView = new DataView(myDataTable);
//MessageBox.Show(myDataTable.Rows.Count.ToString());
dataGrid1.DataSource = myDataView;
//myDataTable.Rows.Clear();
conn.Close();
}
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544094
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет первый, скорее всего напрямую к времени выполнения не относящийся. Закрывай соединение сразу же после считывания всех данных. Т.е. сразу же после цикла while. Конечно других параллельно висящих клиентов бд скорее всего нет (раз это Pocket PC). Но все же.
Совет второй. Попробуй вместо
Код: plaintext
1.
myDataView = new DataView(myDataTable);
использовать
Код: plaintext
1.
myDataView = myDataTable.DefaultView;
Совет третий. Не создавай каждый раз структуру таблицы заново. Создай один раз и храни ее как член класса. Когда таблица становится ненужной, очищай ее (данные), но сам объект с готовой схемой будет жить.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544096
vooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если попытаться "залить" таблицу через DataAdapter, используя метод Fill?
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544117
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SqlDataREader можно сделать DataSource для DataGrid.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544129
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SqlCe не использую :-)

Там можно использовать хранимые процедуры?
Этот запрос повторно (второй и следующий вызов) тоже выполняется 10 секунд?
Попробуйте замерить чистую скорость открытия соединения и чистую скорость заполнения DataTable при помощи DataReader. Надо выяснить где у вас слабое звено, может быть и не в заполнении DataTable все дело.

Попробуйте добавить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // эту строчку
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myRow.EndEdit(); // и эту строчку
myDataTable.Rows.Add(myRow);

Если вы используете DataTable - то пробовали заполнять DataTable при помощи метода Fill DataAdapter'а?
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544134
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторSqlDataREader можно сделать DataSource для DataGrid.
если можно поподробнее,а то на компакте много чего не работает.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544141
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЕсли вы используете DataTable - то пробовали заполнять DataTable при помощи метода Fill DataAdapter'а?пробовал но пока без успеха.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544158
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>пробовал но пока без успеха.

Без успеха по скорости, или не получилось?
И еще 10 секунд - как замеряете по секундомеру или на глазок :-) Ведь речь здесь может идти на миллисекунды

100 записей не показатель. Сделайте хотя бы 1000 записей, тогда разница между различными способами будет более заметна.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544171
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторБез успеха по скорости, или не получилось?не получилось,в данном случае скорость это очень важно осуществляется сбор заказов,и оператор выбирает по справочнику,там своя иерархия,но в группе редко более 100 элементов,так вот хочется чтобы перерисовка Grida при выборе другой группы была максимально быстрой.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544174
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторИ еще 10 секунд - как замеряете по секундомеру или на глазок :-) Ведь речь здесь может идти на миллисекундызамерял по часам
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544179
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш код:
Код: plaintext
1.
2.
3.
4.
5.
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);

Так должно быть быстрее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // добавил эту строку
myRow[ 0 ] = rdr[ 0 ];  //  изменил строку. 
myRow[ 1 ] = rdr[ 1 ]; // изменил строку
myRow[ 2 ]=rdr[ 2 ]; //  изменил строку
myRow.EndEdit(); // добавил эту строку
myDataTable.Rows.Add(myRow);

И интересует чистая производительность DataReader, а не всей процедуры создания DataTable, открытия соединения, заполнения DataTable.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544204
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторИ интересует чистая производительность DataReader, а не всей процедуры создания DataTable, открытия соединения, заполнения DataTable.имеется в виду время выполнения запроса
т.е. cmd.ExecuteReader();-это или???
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544221
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>меется в виду время выполнения запроса
т.е. cmd.ExecuteReader();-это или???

Интересует вот этот кусочек:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();
//MessageBox.Show(myDataTable.Rows.Count.ToString());
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);

}
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544229
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки рекомендую значительно увеличить количество считываемых записей,
пусть потом будет всего 100 зато вы будете знать что используете самый производительный из возможных способов.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544238
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот это самый долгий отрезок
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[0] = rdr.GetSqlString(0).ToString();
myRow[1] = rdr.GetSqlString(1).ToString();
myRow[2]=rdr.GetSqlString(2).ToString();
myDataTable.Rows.Add(myRow);

}
после того как он выполняется ,отображение Grida происходит секунды две не больше.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544248
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВсе таки рекомендую значительно увеличить количество считываемых записей,
пусть потом будет всего 100 зато вы будете знать что используете самый производительный из возможных способов.сейчас нет возможности но сегодня дома обязательно попробую.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32544321
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и хватит считать время выполнения отдельных конструкций по настенным часам с кукушкой :-)

Интересуют выполнение следующих двух вариантов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
System.DateTime before = DateTime.Now;

while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);
}

System.DateTime after = DateTime.Now;
System.TimeSpan diff = after - before;
System.Windows.Forms.MessageBox.Show("My variant: " + diff.Milliseconds.ToString());

И этого варианта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
System.DateTime before = DateTime.Now;

while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // добавил эту строку
myRow[ 0 ] = rdr[ 0 ];  //  изменил строку. 
myRow[ 1 ] = rdr[ 1 ]; // изменил строку
myRow[ 2 ]=rdr[ 2 ]; //  изменил строку
myRow.EndEdit(); // добавил эту строку
myDataTable.Rows.Add(myRow);
}

System.DateTime after = DateTime.Now;
System.TimeSpan diff = after - before;
System.Windows.Forms.MessageBox.Show("Sa variant: " + diff.Milliseconds.ToString());

Результаты естественно в студию :-).
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546014
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я только изменил подсчет времени,предложеный не поехал
1000 записей
long before = DateTime.Now.TimeOfDay.Ticks;
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // добавил эту строку
myRow[0] = rdr[0]; // изменил строку.
myRow[1] = rdr[1]; // изменил строку
myRow[2]=rdr[2]; // изменил строку
myRow.EndEdit(); // добавил эту строку
myDataTable.Rows.Add(myRow);
}
conn.Close();
double after = DateTime.Now.TimeOfDay.Ticks;
1000 записей | 100 записей
первый проход - 45 сек.|6 сек.
второй - 44 сек.|5 сек.
третий - 39 сек.|5 сек.
четвертый - 47 сек.|4 сек.
мой вариант
long before = DateTime.Now.TimeOfDay.Ticks;
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[0] = rdr.GetSqlString(0).ToString();
myRow[1] = rdr.GetSqlString(1).ToString();
myRow[2]=rdr.GetSqlString(2).ToString();
myDataTable.Rows.Add(myRow);

}
conn.Close();
double after = DateTime.Now.TimeOfDay.Ticks;
1000 записей | 100 записей
первый проход - 50 сек.|9
второй - 43 сек.|8
третий - 58 сек.|7
четвертый - 184 сек.|7


верхняя часть
DataTable myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow;
DataView myDataView;

myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
//*******************************
SqlCeConnection conn = null;
conn = new SqlCeConnection ("Data Source = \\SDMMC Disk\\Test.sdf");
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();

смотрел правда на 100 записях,первый раз 4 сек.,все последующие 1 сек.,если кому нибудь будет интересно могу этот кусок и на 1000 посмотреть.



авторСовет третий. Не создавай каждый раз структуру таблицы заново. Создай один раз и храни ее как член класса. Когда таблица становится ненужной, очищай ее (данные), но сам объект с готовой схемой будет жить. а можно пример или ссылку.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546055
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>смотрел правда на 100 записях,первый раз 4 сек.,все последующие 1 сек.,если кому нибудь будет интересно могу этот кусок и на 1000 посмотреть.

Конечно интересно

>а можно пример или ссылку.
Да все уже у тебя есть, осталось только поправить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
private DataTable myDataTable;

//Например в Load формы создадим DataTable один раз
private void Form1_Load(object sender, System.EventArgs e)
{
  CreateDataTable();		
}

private void CreateDataTable()
{
this.myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow; 
DataView myDataView;

myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
}

private void button6_Click(object sender, System.EventArgs e)
{
this.myDataTable.Clear() // Очистим от старых записей
//*******************************
SqlCeConnection conn = null;
conn = new SqlCeConnection ("Data Source = \\SDMMC Disk\\Test.sdf");
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();
//MessageBox.Show(myDataTable.Rows.Count.ToString());
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);

}
myDataView = new DataView(myDataTable);
//MessageBox.Show(myDataTable.Rows.Count.ToString());
dataGrid1.DataSource = myDataView;
//myDataTable.Rows.Clear();
conn.Close();
}

Я так понял тебе эти данные изменять не надо, а надо их всего лишь отобразить?
Если так то чем тебе не подходит совет hDrummer:
"SqlDataREader можно сделать DataSource для DataGrid"
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546093
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще пара ламерских вопросов:
как сделать так чтобы скажем поля id,vzaim не отображались в гриде при том что они там заполнены,и еще должна быть некая дополнительная колонка
куда надо вводить количество т. е цифры,а dataGrid вроде бы как не редактируется???
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546111
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ак сделать так чтобы скажем поля id,vzaim не отображались в гриде при том что они там заполнены,и еще должна быть некая дополнительная колонка

Для этого в DataGrid есть специальная коллекция TableStyles. Где и задаются те колонки которые выводятся, а которые нет а также определяется текст заголовок, формат столбцов и т.д.

>и еще должна быть некая дополнительная колонка
Какая колонка?
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546126
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну колонка - куда надо вводить количество т. е цифры(т.е. чтобы она была редактируемая),а dataGrid вроде бы как не редактируется???
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546329
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ну колонка - куда надо вводить количество т. е цифры(т.е. чтобы она была
редактируемая),а dataGrid вроде бы как не редактируется???

За возможность редактирования, и не редактирования колонок отвечает свойство ReadOnly.

Я правильно понял:

Показываете пользователю 100 записей, он их отрабатывает - вводит числа в один столбец , а потом что? Сохраняете изменения?
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546452
wait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да потом эти введенные данные я буду отображать в документе.
...
Рейтинг: 0 / 0
Заполнение DataGrid(как сделать быстрее)
    #32546857
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну добавьте тогда соответствующую колонку в свой DataTable. И эту колонку также выводите в DataGrid. Только на нее ставим ReadOnly = false. На остальные ReadOnly = true. В итоге вы увидите в datagrid необходимые столбцы , редактировать только сможете myIntColumn.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
private void CreateDataTable()
{
this.myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow; 
DataView myDataView;
myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);
myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);
myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
//дополнительный столбец
myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.Int32");
myColumn.ColumnName = "myIntColumn";   -- название столбца
 
myDataTable.Columns.Add(myColumn);
}
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заполнение DataGrid(как сделать быстрее)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]