Как заполнить столбцы ListBox из Recordset?
Подскажите пожалста, как мне заполнить ЛистБокс данными по столбцам?
В Рекордсет отбираются данные из базы (три столбца)...
...эти данные надо засунуть в ЛистБокс(или другой контрол) в таком-же виде (по столбцам).
А в чем проблема?: непонятно как считать поля всех записей recordset'a или как засунуть такие данные в ListBox...
Со считыванием вроде все Ок...
...проблемы со вставкой...
...но, если не трудно, объясни оба момента (может я что то не то считываю?)
:(
Например для ListBox из MSForms можно так написать, вот что у меня получилось:
Dim i As Long, k As Long
Set rst = New ADODB.Recordset
With rst
strSQL = "SELECT * FROM f101_0903"
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open Source:=strSQL, Options:=adCmdText
End With
If Not rst.EOF And Not rst.BOF Then ' если не пустой
' устанв. макс. кол-во столбцов в ListBox
ListBox1.ColumnCount = rst.Fields.Count
Do Until rst.EOF ' крутим до конца rst
' в первый столбец так добавляем, а для остальных строка уже будет
ListBox1.AddItem CStr(rst.Fields(0))
For k = 1 To rst.Fields.Count - 1
ListBox1.List(i, k) = CStr(rst.Fields(k))
Next k
i = i + 1
rst.MoveNext
Loop
End If
rst.Close
Set rst = Nothing
ListBox1.AddItem CStr(rst.Fields(0))
А вот здеся проблемы:
ListBox1.List(i, k) = CStr(rst.Fields(k))
Пишет:
"Run-time error '381':
Could not set the List property. Invalid property array index.
Help???
:{
Так у меня тоже работает:
ListBox1.AddItem CStr(rst.Fields(0))
А вот здеся проблемы:
ListBox1.List(i, k) = CStr(rst.Fields(k))
Пишет:
"Run-time error '381':
Could not set the List property. Invalid property array index.
Help???
:{
В общем виде:
ListBox1.List()=MyArray
dedtolya
В общем случае, как уже правильно заметили, самый универсальный способ это запихнуть через свойство ListBox.List массив нужной размерности MyArray().
Просто мне хотелось написать код более универсальный, независящий от конкретного вида Recordset, а через массив это очень тяжело сделать. Поэтому в разных версиях ListBox есть доп. свойства, позволяющие пихать туда строку по ходу из нескольких столбцов. Конкретней будет, когда скажешь что используешь...
придется немного потыкаться... P(
В общем виде:
ListBox1.List()=MyArray
dedtolya
Воспользуйся ListViev и не парься :)
ListBox1.AddItem "Первая строка"
ListBox1.List(0) = "row1 col1;row1 col2;row1 col3;"
и напиши, что ты увидишь: будет разделение на столбцы или нет?
ListBox1.List(0) = "row1 col1;row1 col2;row1 col3;"
...увидел "row1 col1;row1 col2;row1 col3;" одной строкой:{
...скорее всего срока записалась поверх "Первая строка":(
ListBox1.AddItem "Первая строка"
ListBox1.List(0) = "row1 col1;row1 col2;row1 col3;"
...увидел "row1 col1;row1 col2;row1 col3;" одной строкой:{
...скорее всего срока записалась поверх "Первая строка":(
Она и должна записаться поверх первой строки и быть только одной строкой, но в дополнении к этому знак ; должен был разделить эту строку на несколько столбцов,.... - значит не подошло
...есть проблема:
в рекордсете данные разных типов...
...первый столбец массива заполняется, а остальные - пустые (из-за типов?)
ListBox1.Column() = record_ware.GetRows
Может в этом способе есть какой то недостаток???
Что то я не очень доверяю простым решениям...
Он еще имеет три необязательных параметра, чтобы можно было не все записи извлекать или не все столбцы, если надо могу с примером чуть подробнее написать
Для меня в этой области еще очень много нового...
...раньше только с Excel работал, а сейчас поток данных такой, что надо перебираться на базы данных...
...так что если есть какие то советы - буду признателен...:)
Тачка слбая?
Метод GetRows содержит 3 необязательных параметра:
.GetRows(RowsToGrab, Start, Fields):
1.RowsToGrab (тип Integer) - скоко строк требуется скопировать в массив (по умолч. все).
2. Start (тип Variant) - это закладка с которой надо начать копирование (ВНИМАНИЕ: по умолч. с текущей). Если надо, могу подробнее рассказать что-такое закладка Bookmark в Recordset.
3. Fields (тип строкой массив) - для передачи методу массива имен полей для копирования (по умолч. все). Исползовать, например:
rst.GetRows(Fields:=Array("CompName","ContactName"))
...а насчет Bookmark в Recordset, если не трудно, объясни подробнее:)
Dim varBook as Variaте
varBook=rst.Bookmark
(ВНИМАНИЕ: переменная varBook представляет собой положительное число от 0 до 4294967295. Т.е. это по сути сдвинутый в положительную область тип данных Long. Посколько такого типа данных нет, то его заменяет Variant, поэтому все закладки - Variant)
После сохранения в переменной, можно быстро перейти на нужную запись. Для этого надо свойству rst.Bookmark присвоить сохраненную закладку:
rst.Bookmark=varBook
Т.е. свойство rst.Bookmark служит для чтения/сохранения закладки так и для установки/перемещения к ней.
Огромное спасибо за подробное объяснение:)
:-? а у КомбоБокса случайно нет параметра, который принимает массив?
To SergeySV:
Огромное спасибо за подробное объяснение:)
:-? а у КомбоБокса случайно нет параметра, который принимает массив?
Нашел Комбик с такими-же параметрами, как и ЛистБокс...:}
Нашел Комбик с такими-же параметрами, как и ЛистБокс...:}
Они близнецы братья.
Нашел Комбик с такими-же параметрами, как и ЛистБокс...:}
Не понимаю, в чем тут вообще может возникнуть проблема?! Берете рекордсет, проверяете на БОФ, после чего делаете мов ферст. в цикле, пока не ЕОФ, делаете:
listitem = lvwList.listitems.add()
listitem.subitems(1) = "текст 2-го столбца"
listitem.subitems(2) = "текст 3-го столбца"
rst.movenext
Все!
Кстати, о птичках, лучше пользоваться move чем find.
Надо учитывать, что далеко не у всех контролов есть такие параметры...
...я таких контролов не знаю...
...подскажешь?
To Dolonet:
Надо учитывать, что далеко не у всех контролов есть такие параметры...
...я таких контролов не знаю...
...подскажешь?
Это один из 2-х вообще мне известных контролов... Причем второй, скорее всего, не известен никому из читателей... Меня несколько удивило, что о первом Вы не знаете.
Если Вы работаете в VB6, то это надо присоединить компонент Microsoft Windows Common Controls 6.0 (sp4 например). Там и лежит такой контрол ListView. В MSDN, смотрю, по нему море доки.
Удачи!
Пасиба!!!
К сожалению на работе у меня стоит VB6, и он без MSDN...
...но, я думаю, разберусь:)