Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Медленная работа ListView / 25 сообщений из 26, страница 1 из 2
17.11.2008, 14:27:57
    #35657952
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Думаю с этой проблемой сталкивались многие, хотелось бы узнать кто как с ней справился.
Имеется ListView:

Код: plaintext
1.
2.
3.
Grid        = CreateWindowW(TEXT("SysListView32"),TEXT(""),WS_VISIBLE | WS_CHILD | WS_BORDER |LVS_REPORT | LVS_SINGLESEL, maxX-(( 98 *maxX)/ 100 ), maxY-(( 91 *maxY)/ 100 ), maxX-(( 4 *maxX)/ 100 ), (maxY-(maxY* 40 / 100 )),hWnd,(HMENU)IDM_Grid,g_hInst,NULL);

SendMessage(Grid ,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES , LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES| LVS_SINGLESEL);

Есть кнопочка, по нажатии на которую происходит заполнение таблицы случайными данными:
Код: 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.
case IDM-MyButton:
{
            ShowWindow(Grid,false);
				
	    LV_COLUMN lvc;
	    LV_ITEM lvi;

	    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;	 
	    lvc.fmt  = LVCFMT_LEFT;				 //  текст выравниваем по левой стороне
	    lvc.cx= 60 ;					                //  ширин строки по умолчанию
	    lvi.mask = LVIF_TEXT | LVIF_PARAM ;		     //   параметры строчки
						
					
            lvc.pszText  = (LPWSTR)L"dsfdsf";
	    lvc.cx		  =  60 ;										
	    for(int j= 0 ;j< 6 ;j++)
		{
			lvc.iSubItem = j;
			ListView_InsertColumn(Grid, j, &lvc);	
		}
									
	     for(int i = 0 ;i< 1000 ;i++)
		{
			for(int j= 0 ;j< 6 ;j++)
				{
					lvi.iSubItem = j;                                            // столбец
					lvi.iItem    = i;	                 		       // строка
					lvi.pszText  = (LPWSTR)L"werwr";                    // текст
					ListView_InsertItem (Grid,&lvi);
					ListView_SetItemText(Grid,lvi.iItem,lvi.iSubItem,(LPWSTR)lvi.pszText);
				}
		}
	        ShowWindow(Grid,true);
}

ShowWindow(Grid,true); и соответственно ShowWindow(Grid,false); - для того чтобы не вызывалась перерисовка.

Как видите все значения взяты на "шару", только для представления данного примера; в общем то заполняем значит 1000 строк в 6 столбцов, и это происходит аж 5 сек,а то и 6 !!! (на КПК, под управлением WinCE). - что непозволительно долго
Прошу помочь мне, скажите что не так.
...
Рейтинг: 0 / 0
17.11.2008, 14:37:00
    #35657988
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
А если вызвать сначала SetItemCount()?
...
Рейтинг: 0 / 0
17.11.2008, 15:32:01
    #35658202
Алексей Морозов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Я предлагаю сразу отказаться от ListView в пользу какого нибудь грида.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
17.11.2008, 15:41:34
    #35658231
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
>>А если вызвать сначала SetItemCount()?
В реальной задаче заранее не известно кол-во item'ов, все данные берутся из БД и на "лету" заполняются в таблицу. Делать же два цикла (сначала считаем кол-во, потом заполняем) - это не выход ((

>>Я предлагаю сразу отказаться от ListView в пользу какого нибудь грида.
Что именно можно использовать? что посоветуете?.. пишу на чистом API.
...
Рейтинг: 0 / 0
17.11.2008, 15:47:09
    #35658253
Алексей Морозов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
> Что именно можно использовать? что посоветуете?.. пишу на чистом API.

Можно посмотреть компоненты OCX, ActiveX.
Можно написать самому, я могу небольшой рабочий пример подкинуть.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
17.11.2008, 15:49:46
    #35658265
Алексей Морозов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Очень похоже на ListView.
1) Но поддерживат только режим работы
2) Но не поддерживат редактирования в ячейке (ListView это позволяет лишь в первой колонке)
3) Где то есть мелкие недочности.
...
Рейтинг: 0 / 0
17.11.2008, 16:37:03
    #35658389
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Счас посмотрю ) большое спасибо! )))
ЗЫ: для ввода в ячеку вызываю дилог с Editom и кнопочкой ОК ;).. но ранне здесь же на форуме обсуждалась данная тема, и проблема с вводом непосредственно в ячейку была решена.
...
Рейтинг: 0 / 0
17.11.2008, 16:39:50
    #35658400
Алексей Морозов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Иванно ранне здесь же на форуме обсуждалась данная тема, и проблема
с вводом непосредственно в ячейку была решена.

15 строк кода

1) Создать Edit на гриде и правильно разместить его над ячейкой
2) Перемещать или скрывать его в каких то случаях.


Posted via ActualForum NNTP Server 1.4

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
17.11.2008, 18:29:33
    #35658725
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Код: 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.
case IDM-MyButton:
{
            ShowWindow(Grid,false);
				
	    LV_COLUMN lvc;
	    LV_ITEM lvi;

	    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;	 
	    lvc.fmt  = LVCFMT_LEFT;				 //  текст выравниваем по левой стороне
	    lvc.cx= 60 ;					                //  ширин строки по умолчанию
	    lvi.mask = LVIF_TEXT | LVIF_PARAM ;		     //   параметры строчки
						
					
            lvc.pszText  = (LPWSTR)L"dsfdsf";
	    lvc.cx		  =  60 ;										
	    for(int j= 0 ;j< 6 ;j++)
		{
			lvc.iSubItem = j;
			ListView_InsertColumn(Grid, j, &lvc);	
		}
									
	     for(int i = 0 ;i< 1000 ;i++)
		{
			for(int j= 0 ;j< 6 ;j++)
				{
					lvi.iSubItem = j;                                            // столбец
					lvi.iItem    = i;	                 		       // строка
					lvi.pszText  = (LPWSTR)L"werwr";                    // текст
					ListView_InsertItem (Grid,&lvi);

// во-первых, создание итема надо вынести из цикла по колонкам - итем ОДИН, колонок у него МНОГО.
// а так в итоге ты создаёшь в 6 раз больше строк, чем нужно.

					ListView_SetItemText(Grid,lvi.iItem,lvi.iSubItem,(LPWSTR)lvi.pszText);
				}
		}
	        ShowWindow(Grid,true);
}

ShowWindow(Grid,true); и соответственно ShowWindow(Grid,false); - для того чтобы не вызывалась перерисовка.

Надо использовать LockWindowUpdate() , а не show/hide.


А в третьих надо использовать virtual list view. Это спец. режим работы, когда все данные НЕ ХРАНЯТЬСЯ в ListView, а запрашиваются у приложения при отображении.

Поищи на MSDN именно по "virtual list view" -- легко найдёшь хорошую статью о том, как это делается.
...
Рейтинг: 0 / 0
17.11.2008, 18:32:43
    #35658731
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
что-то другое кроме ListView имеет смысл использовать лишь если нужна кроссплатформенность или
какие-то out-of the-box фичи. ListView достаточно мощный и быстрый, надо только уметь им пользоваться.
Мы пробовали кроме него MSflexGrid ActiveX, но особого восторга по его скорости и неглюковитости не было -- и медленный, и глюковатый.
...
Рейтинг: 0 / 0
18.11.2008, 10:53:08
    #35659711
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
>>// а так в итоге ты создаёшь в 6 раз больше строк, чем нужно.
Тоесть мне вынести ListView_InsertItem (Grid,&lvi); ? - в таком случае у меня грид получается пустой..
я так понял что ListView_InsertItem (Grid,&lvi); - как бы "ячейку" вставляет.
...
Рейтинг: 0 / 0
18.11.2008, 10:58:19
    #35659726
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
а операция: lvi.iItem = i; - не существенна в данном случае.
...
Рейтинг: 0 / 0
18.11.2008, 11:00:30
    #35659733
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Иван4444 пишет:

> Тоесть мне вынести ListView_InsertItem (Grid,&lvi); ? - в таком случае у
> меня грид получается пустой..

ListView_InsertItem - создаёт СТРОКУ. Соответственно, положите его
в тело цикла по строкам, а не по колонкам строк.

> я так понял что ListView_InsertItem (Grid,&lvi); - как бы "ячейку"
> вставляет.

Нет. Item- строка. Колонка - Subitem.
Иногда также (на самом деле везде в документации) при
описании поля 0 в строке говорят, что это - item, а
всех остальных - что это subitem.

Т.е. Item - это вся строка и нулевая её колонка.
Subitem - все осталные колонки.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
18.11.2008, 11:09:26
    #35659774
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
вы и вправду МАСТЕР, MasterZiv )))
... когда только создавал свою табличку, то в качестве iSubItema, в голову не приходило вручную ствить 0 .
Потому решил что это ячейка.
.. счас разберусь с виртуальными.. - если есть у кого небольшой код, в качестве примера, типа того что привел я, то буду оч рад!.. Всем заранее спасибо!
...
Рейтинг: 0 / 0
18.11.2008, 19:25:22
    #35661604
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Иван4444 пишет:

> .. счас разберусь с виртуальными.. - если есть у кого небольшой код, в
> качестве примера, типа того что привел я, то буду оч рад!.. Всем заранее
Я говорил, в MSDN поищите, там есть подробнейшие примеры.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
27.11.2008, 08:57:13
    #35678172
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Чтот не могу понять как именно заполняется virtual list view,
делаю это следующим образом:

Код: 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.
 if(((LPNMHDR)lParam)->hwndFrom == mw.Grid )
 {
   NMHDR* pnmh = (NMHDR*) lParam;

   switch(pnmh->code)
   {
	case LVN_GETDISPINFO:
	{
          LV_DISPINFO* pdi = (LV_DISPINFO*)lParam;
	  wstring SubItem;
         
          SubItem = L"Субитем";
          				
          pdi->item.mask  = LVIF_TEXT;				 
	  pdi->item.iItem = mw.Linenumber;

          pdi->item.iSubItem = mw.Colnumber;	
          ZeroMemory(iw, 6 );
	  _itow(mw.Colnumber,iw, 10 );
					
	  SubItem = SubItem + iw;
	  pdi->item.pszText    = (LPWSTR)SubItem.data();

          if(mw.Colnumber== 3 )          // Всего три колонки
	  {
		mw.Linenumber++;
		mw.Colnumber =  0 ;
	  }
            

        }
   }
 }

Реультат хотелось бы получить : колонка1 | колонка2 | колонка3 |
субитем0| субитем1 | субитем2 |
..... | ..... | .... |

но получается не совсем то что надо, и скажем при клике на какойнибудь элемент, все содержимое меняется.
ЗЫ: вся проблема осложняется тем, что работать он должен следующим образом - заполниться значениями из БД.
...
Рейтинг: 0 / 0
27.11.2008, 09:07:21
    #35678185
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
вопрос есче в том, когда посылается, и сколько раз и с какой целью сообщение: LVN_GETDISPINFO
...
Рейтинг: 0 / 0
27.11.2008, 09:13:58
    #35678199
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
я так понял, когда каждый раз перерисовка, но как тогда сделать так, чтоб list view был стабилен?
...
Рейтинг: 0 / 0
27.11.2008, 12:20:00
    #35678707
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Иван4444 пишет:

> вопрос есче в том, когда посылается, и сколько раз и с какой целью
> сообщение: LVN_GETDISPINFO
На первую клетку -- для всей строки, для её текста, иконки и состояний
и пр. лабуды. Потом - на все остальные ячейки.
И так для всех видимых строк.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
27.11.2008, 12:20:07
    #35678708
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Иван4444 пишет:
> Чтот не могу понять как именно заполняется virtual list view,
> делаю это следующим образом:

Чтобы заполнить виртуальный LV, нужно только установить кол-во
колонок и кол-во item-ов. SetItemCount() кажется. Всё остальное
вытаскивается по требованию.

Маску, на сколько я помню, вы должны не заполнять,
а опрашивать, и заполнять поля, которые нужны.
Ваш код я вообще не понял. что вы там делаете - загадка.



> ЗЫ: вся проблема осложняется тем, что работать он должен следующим
> образом - заполниться значениями из БД.

Ну так самое то как раз для него.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
27.11.2008, 12:20:48
    #35678713
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Иван4444 пишет:
> я так понял, когда каждый раз перерисовка, но как тогда сделать так,
> чтоб list view был стабилен?

Это что значит ?
Он и так стабилен.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
27.11.2008, 12:32:25
    #35678765
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
MasterZiv пишет:

Вот как примерно должен выглядеть OnGetDisplayInfo

Код:
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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
void CTDBGridImpl::onGetDisplayInfo (NMHDR* pNMHDR, LRESULT* pResult)
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
	LV_ITEM* pItem = &pDispInfo->item;

   if( !m_dataSet || m_columns.empty() )
   {
   	*pResult = FALSE;
     return;
   }

	unsigned row = pItem->iItem;
	unsigned col = m_columns[pItem->iSubItem].fieldNoInDataSet(*m_dataSet);

   if( row >= m_dataSet->NRows() || col >= m_dataSet->NColumns() )
   {
   	*pResult = FALSE;
     return;
   }

	if( pItem->mask & LVIF_TEXT )
	{
     #ifdef _XDEBUG
       //TRACE( _T("ID %u : GetDisplayInfo TEXT item = %d, subitem = %d. Length 
%d.\n"), m_listCtrl->GetDlgCtrlID(), pItem->iItem, pItem->iSubItem, 
pItem->cchTextMax );
     #endif

     CTEXT::CTString displayVal;
     getCellText( row, col, displayVal );
     _tcsncpy( pItem->pszText, LPCTSTR(displayVal), pItem->cchTextMax );
	}

	if( pItem->mask & LVIF_IMAGE )
   {
     UINT listCtrlID = m_listCtrl->GetDlgCtrlID();
	  pItem->iImage = pItem->iIndent = 0;
     unsigned char stateImage = 0;
     unsigned char overLayImage = 0;

     if( !pItem->iSubItem )
     {
       if( m_exteriorProcessor &&
           m_exteriorProcessor->rowImages( listCtrlID, m_dataSet->Row(row), row, 
pItem->iImage, stateImage, overLayImage, pItem->iIndent )
         )
       {
         pItem->state = ( pItem->state & ~(LVIS_STATEIMAGEMASK|LVIS_OVERLAYMASK) 
) |
                        INDEXTOSTATEIMAGEMASK(stateImage) |
                        INDEXTOOVERLAYMASK(overLayImage);
       }
       if( m_exteriorProcessor )
         m_exteriorProcessor->fieldImage( listCtrlID, m_dataSet->Row(row), row, 
col, pItem->iImage );
     }
     else
     {
       if( m_exteriorProcessor )
         m_exteriorProcessor->fieldImage( listCtrlID, m_dataSet->Row(row), row, 
col, pItem->iImage );
     }
   }

	*pResult = FALSE;
}


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
27.11.2008, 14:33:18
    #35679342
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Да, мои предыдущие сообщения и вправду выглядят не вполне ясно, попробую исправиться ))
вот для примера мой старый код для простого list view:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
InsertColumn(mw.Grid,mw.lvc, 0 ,L"Колонка1", 60 , 0 );
InsertColumn(mw.Grid,mw.lvc, 1 ,L"Колонка2", 60 , 1 );
InsertColumn(mw.Grid,mw.lvc, 2 ,L"Колонка3", 60 , 2 );
InsertColumn(mw.Grid,mw.lvc, 3 ,L"Колонка4", 60 , 3 );			
			
wstring rezult;
int lineNumber =  0 ;
while(EoF()!=true)
{
 NextData();

   InsertRow (mw.lvi,mw.Grid   ,lineNumber);
  
   InsertItem(mw.lvi,lineNumber, 0 ,GetTextByColName(L"Col1"),mw.Grid);
   InsertItem(mw.lvi,lineNumber, 1 ,GetTextByColName(L"Col2"),mw.Grid);
   InsertItem(mw.lvi,lineNumber, 2 ,GetTextByColName(L"Col3"),mw.Grid);
   InsertItem(mw.lvi,lineNumber, 3 ,GetTextByColName(L"Col4"),mw.Grid);

   lineNumber++;

}	
Finalize();

При этом заполнялся List view из БД. Все бы ничего, но долго.

счас же я пробовал поступить таким вот методом:
Код: 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.
switch(pnmh->code)
{
  case LVN_GETDISPINFO:				
  {
     if(mw.b_vt_switch ==  0 )
     {
	mw.b_vt_switch =  1 ;
	wstring SQL;			

	SQL.clear();
	SQL = L"select cln.VNAME,cln.VADRES,cln.NID from cln ORDER BY cln.VNAME";

	wstring err;
	err = ExecPrepare(SQL);

	if(err.empty()==false)
	{MessageBox(hWnd,err.data(),L"Error",MB_OK);}
	err.clear();
      }

       if(pdi->item.iSubItem ==  0 )				
       {
	 if(mw.b_vt_subitem_switch ==  0 )
	 {
	    NextData();
	    pdi->item.pszText = (LPWSTR)GetTextByColName(L"col1").data();
						
	    mw.b_vt_subitem_switch =  1 ;
	    mw.interest_count++;
	 }
	 else
	 {
		mw.b_vt_subitem_switch =  0 ;
	 }
      }
  
     if(pdi->item.iSubItem ==  1 )
     {
	pdi->item.pszText = (LPWSTR)GetTextByColName(L"col2").data();	
     }

      if(pdi->item.iSubItem ==  2 )
      {
	pdi->item.pszText = (LPWSTR)GetTextByColName(L"col3").data();
      }

      if(EoF() == true)
      {
	mw.b_vt_switch =  0 ;
	Finalize();
	ShowWindow(mw.Grid,true);
      }

Тепреь такая проблема: допустим у меня 100 записей, и по идее, если б я просто заполнял ListView,
то я бы прошелся по всем записям, заполнил ListView и выполнил файнолайз.
Но Virtual LIst View работает следующим образом: выводит только то что влазит в видимую часть.
Так у меня влазит 12 записей, (БД ждет следующего запроса, Finalize не вызвался), при прокрутке списка в них -все отрисовывается замечательно, но при прокрутке в верх, он выводит не предыдущую запись, а следующую из БД.

Так вот мне хочется ухнать, неужели нужно каждый раз при выхое перерисовки, сбрасиывать БД, затем в холостом ходе прокручивать до нужной позиции и делать вывод?
...
Рейтинг: 0 / 0
28.11.2008, 11:55:37
    #35681459
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Иван4444 пишет:

> while(EoF()!=true)
> {
> NextData();
>
> InsertRow (mw.lvi,mw.Grid ,lineNumber);
>
> InsertItem(mw.lvi,lineNumber,*0*,GetTextByColName(L"Col1"),mw.Grid);
> InsertItem(mw.lvi,lineNumber,*1*,GetTextByColName(L"Col2"),mw.Grid);
> InsertItem(mw.lvi,lineNumber,*2*,GetTextByColName(L"Col3"),mw.Grid);
> InsertItem(mw.lvi,lineNumber,*3*,GetTextByColName(L"Col4"),mw.Grid);
>
> lineNumber++;
>
> }
> Finalize();

в Virtual LIst View не нужно делать InsertItem.

> case LVN_GETDISPINFO:
> {
> if(mw.b_vt_switch == *0*)
> {
> mw.b_vt_switch = *1*;
> wstring SQL;
>
> SQL.clear();
> SQL = L"select cln.VNAME,cln.VADRES,cln.NID from cln ORDER BY cln.VNAME";
>
> wstring err;
> err = ExecPrepare(SQL);

Да вы чего, с ума сошли ? Вы что ж будете на обновление каждой ячейки запрос
выполнять ? Его надо выполнить один раз и созранить результат, а потом
показывать.

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

Это у вас неправильно что-то написано. Кроме того,
НЕЛЬЗЯ делать запрос внутри LVN_GETDISPINFO.
Это происходит очень часто и очень непредсказуемо.

> Так вот мне хочется ухнать, неужели нужно каждый раз при выхое
> перерисовки, сбрасиывать БД, затем в холостом ходе прокручивать до
> нужной позиции и делать вывод?

Ничего никуда сбрасывать не надо. Надо выполнить запрос, получить
его результат, сохранить, и потом показывать в ListView.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.11.2008, 12:20:35
    #35681556
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленная работа ListView
Большое вам спасибо, вы мне реально помогли.
Меня смущало следующее, дело в том что если выполнить запрос и записать куда то - это схоже с тем что их записать в List View (но вот время заполнения м.б. кончено разным), и таким образом нет смысла куда либо их писать. Да и вообще дублировать БД, тоже не хотелось.
Есче раз спасибо за исчерпывающий ответ.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Медленная работа ListView / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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