Элемент управления ListView. Использование ActiveX объекта ListView в HTA.



ActiveX компонент ListView устанавливается вместе с Microsoft Office и содержится в библиотеке MSCOMCTL.OCX
Это необходимый инструмент для вывода различных списков в виде таблицы.
Разместить объект на странице можно так:

<OBJECT ID="ListView1" WIDTH=375 HEIGHT=580 CLASSID="CLSID:BDD1F04B-858B-11D1-B16A-00C0F0283628" style="margin: 5px; border: 1px solid;">
 <PARAM NAME="SortKey" VALUE="0">
 <PARAM NAME="View" VALUE="3">
 <PARAM NAME="Arrange" VALUE="0">
 <PARAM NAME="LabelEdit" VALUE="1">
 <PARAM NAME="NumItems" VALUE="0"> 
</OBJECT>

В тегах PARAM содержаться настройки отображения объекта. Подробнее об этом можно прочитать тут: MSDN

Вот пример заполнения ListView данными из запроса:
<html>
<script language="vbscript">
Sub Window_Onload
' Добавляем колонки
        ListView1.ColumnHeaders.Add , , "ID", 50
	ListView1.ColumnHeaders.Add , , "Наименование", 290	
' Читаем файл подключения. Такая конструкция используется во всех примерах, где описана работа с БД.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
	Set WshShell = CreateObject("WScript.Shell")
	path = WshShell.CurrentDirectory 
	udlFile = "sm.udl"
  strFilePath = Path & "" & udlFile 'Читаем файл подключения
  Const For_Reading = 1
  Const Tristate_True = -1
  Set objTS = objFSO.OpenTextFile(strFilePath,  For_Reading, False, Tristate_True)
  objTS.SkipLine
  objTS.SkipLine
  Udlread=objTS.Readline
  Set DBConn = CreateObject("ADODB.Connection")' Здесь может быть любой другой источник данных ODBC, главное это указать его в udl
  DBConn.Open(Udlread) 'Пробуем подключится
	SQLstr = "SELECT * FROM CLASSIF_TREE_CHILD(0, 119, 1)  order by ID_CLASSIF"
	Set DBrecords=DBConn.Execute(SQLstr)
While Not DBrecords.EOF
SqRec="select * from cardscla where classif="+Cstr(DBrecords.Fields(0).Value)
set SdbRec=DBConn.Execute(SqRec)
if SdbRec.EOF then
else
  Call AddItem(Cstr(DBrecords.Fields(0).Value),Cstr(DBrecords.Fields(2).Value)) ' Вызываем процедуру заполнения ListView
 end if
  DBrecords.MoveNext	
Wend
End Sub

 Sub AddItem(ID, Name) ' Заполнение строк
            With ListView1.ListItems.Add(, , ID)
                With .ListSubItems
	     .Add ,, Name
                End With
            End With
 End Sub
</script>

<body scroll="NO" style="text-align: center">
<b><font size=2 color="black">Выберите группы товаров</font></b><br>
   	<OBJECT ID="ListView1" WIDTH=580 HEIGHT=580 CLASSID="CLSID:BDD1F04B-858B-11D1-B16A-00C0F0283628" style="margin: 5px; border: 1px solid;">
                 <PARAM NAME="SortKey" VALUE="0">
                 <PARAM NAME="View" VALUE="3">
                 <PARAM NAME="Arrange" VALUE="0">
                 <PARAM NAME="LabelEdit" VALUE="1">
                 <PARAM NAME="SortOrder" VALUE="0">
                 <PARAM NAME="Sorted" VALUE="0">
                 <PARAM NAME="MultiSelect" VALUE="0">
                 <PARAM NAME="LabelWrap" VALUE="-1">
                 <PARAM NAME="HideSelection" VALUE="0">
                 <PARAM NAME="HideColumnHeaders" VALUE="0">
                 <PARAM NAME="OLEDragMode" VALUE="0">
                 <PARAM NAME="OLEDropMode" VALUE="0">
                 <PARAM NAME="AllowReorder" VALUE="-1">
	   <PARAM NAME="Checkboxes" VALUE="0">
	   <PARAM NAME="FlatScrollBar" VALUE="0">
	   <PARAM NAME="FullRowSelect" VALUE="-1">
	   <PARAM NAME="GridLines" VALUE="-1">
	   <PARAM NAME="HotTracking" VALUE="0">
	   <PARAM NAME="HoverSelection" VALUE="0">
	   <PARAM NAME="PictureAlignment" VALUE="0">
	   <PARAM NAME="TextBackground" VALUE="0">
	   <PARAM NAME="ForeColor" VALUE="-2147483640">
	   <PARAM NAME="BackColor" VALUE="-2147483624">
	   <PARAM NAME="BorderStyle" VALUE="0">
  	   <PARAM NAME="Appearance" VALUE="0">
	   <PARAM NAME="MousePointer" VALUE="0">
	   <PARAM NAME="Enabled" VALUE="1">
	   <PARAM NAME="NumItems" VALUE="0"> 
   </OBJECT>
</boby></html>



Возможности ListView на этом не ограничиваются. Так же можно задействовать сортировку:
Sub ListView1_ColumnClick(ColumnHeader) ' Сортировка при нажатии на заголовок столбца
	With ListView1
		.Sorted = False
		.SortKey = ColumnHeader.Index - 1
		If .SortOrder = 0 Then
		 .SortOrder = 1
		Else
		 .SortOrder = 0
		End If
		.Sorted = True
	End With
End Sub

Реакция на двойной клик в строке:

Sub ListView1_DblClick()
che=ListView1.SelectedItem.text
if Left(ListView1.SelectedItem.ListSubItems(1), 9)<>" ВЫБРАНО " then ' помечаем выбраную строку словом "ВЫБРАНО"
ListView1.SelectedItem.ListSubItems(1)=" ВЫБРАНО " + ListView1.SelectedItem.ListSubItems(1)
Else
ListView1.SelectedItem.ListSubItems(1)=Right(ListView1.SelectedItem.ListSubItems(1),len(ListView1.SelectedItem.ListSubItems(1))-9)
end if
With ListView1 ' Сртируем список так, чтобы выбранные элементы оказывались сверху
		.Sorted = False
		.SortKey = 1
		If .SortOrder = 0 Then
			.SortOrder = 1
		Else
			.SortOrder = 0
		End If
		.Sorted = True
	End With
With ListView1
		.Sorted = False
		.SortKey = 1
		If .SortOrder = 0 Then
			.SortOrder = 1
		Else
			.SortOrder = 0
		End If
		.Sorted = True
	End With	
end sub	

Реакция на кнопки Enter и Esc:

Sub ListView1_KeyPress(Key)
FndIt = Chr(key)
if key=27 then window.close
if key=13 then Call  ListView1_DblClick()
if key=32 then call ready()
end Sub