Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как заполнить столбцы ListBox из Recordset?

478
11 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Всем здрасте!

Подскажите пожалста, как мне заполнить ЛистБокс данными по столбцам?

В Рекордсет отбираются данные из базы (три столбца)...
...эти данные надо засунуть в ЛистБокс(или другой контрол) в таком-же виде (по столбцам).
258
11 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
А в чем проблема?: непонятно как считать поля всех записей recordset'a или как засунуть такие данные в ListBox...
478
11 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by SergeySV
А в чем проблема?: непонятно как считать поля всех записей recordset'a или как засунуть такие данные в ListBox...



Со считыванием вроде все Ок...
...проблемы со вставкой...
...но, если не трудно, объясни оба момента (может я что то не то считываю?)
:(

258
11 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Ну давай, посмотрим.

Например для ListBox из MSForms можно так написать, вот что у меня получилось:

Код:
Dim rst As ADODB.Recordset
 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
478
11 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Так у меня тоже работает:
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???
:{
3.7K
11 ноября 2003 года
dedtolya
41 / / 12.10.2003
Цитата:
Originally posted by XtreamAll
Так у меня тоже работает:
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

258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Это потому что твой ListBox не из MSForms, ты где пишешь то?

В общем случае, как уже правильно заметили, самый универсальный способ это запихнуть через свойство ListBox.List массив нужной размерности MyArray().

Просто мне хотелось написать код более универсальный, независящий от конкретного вида Recordset, а через массив это очень тяжело сделать. Поэтому в разных версиях ListBox есть доп. свойства, позволяющие пихать туда строку по ходу из нескольких столбцов. Конкретней будет, когда скажешь что используешь...
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Пишу в VB6...
258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Мдам, VB6 у меня как раз под рукой-то и нет X)-

придется немного потыкаться... P(
266
12 ноября 2003 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by dedtolya



В общем виде:
ListBox1.List()=MyArray

dedtolya



Воспользуйся ListViev и не парься :)

258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
В Access у ListBox есть такая фича, попробуй написать так для проверки:

ListBox1.AddItem "Первая строка"
ListBox1.List(0) = "row1 col1;row1 col2;row1 col3;"

и напиши, что ты увидишь: будет разделение на столбцы или нет?
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
ListBox1.AddItem "Первая строка"
ListBox1.List(0) = "row1 col1;row1 col2;row1 col3;"

...увидел "row1 col1;row1 col2;row1 col3;" одной строкой:{
...скорее всего срока записалась поверх "Первая строка":(
258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
ListBox1.AddItem "Первая строка"
ListBox1.List(0) = "row1 col1;row1 col2;row1 col3;"

...увидел "row1 col1;row1 col2;row1 col3;" одной строкой:{
...скорее всего срока записалась поверх "Первая строка":(



Она и должна записаться поверх первой строки и быть только одной строкой, но в дополнении к этому знак ; должен был разделить эту строку на несколько столбцов,.... - значит не подошло

478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Сейчас пробую через ListBox1.Column()=MyArray...
...есть проблема:
в рекордсете данные разных типов...
...первый столбец массива заполняется, а остальные - пустые (из-за типов?)
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
:D А ларчик просто открывался...

ListBox1.Column() = record_ware.GetRows

Может в этом способе есть какой то недостаток???
Что то я не очень доверяю простым решениям...
258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Неа, самое оно, совсем забыл про этот метод у recordset (склероз..:o), он возвращает как раз массив и геммориться не надо.

Он еще имеет три необязательных параметра, чтобы можно было не все записи извлекать или не все столбцы, если надо могу с примером чуть подробнее написать
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Надо!
Для меня в этой области еще очень много нового...
...раньше только с Excel работал, а сейчас поток данных такой, что надо перебираться на базы данных...
...так что если есть какие то советы - буду признателен...:)
258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Блин, все тебе написал и комп завис, ох уж этот win98 мне... :x
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
А 2000 или XP чего не поставишь?
Тачка слбая?
258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Итак, начнем снова:

Метод GetRows содержит 3 необязательных параметра:
.GetRows(RowsToGrab, Start, Fields):

1.RowsToGrab (тип Integer) - скоко строк требуется скопировать в массив (по умолч. все).

2. Start (тип Variant) - это закладка с которой надо начать копирование (ВНИМАНИЕ: по умолч. с текущей). Если надо, могу подробнее рассказать что-такое закладка Bookmark в Recordset.

3. Fields (тип строкой массив) - для передачи методу массива имен полей для копирования (по умолч. все). Исползовать, например:
rst.GetRows(Fields:=Array("CompName","ContactName"))
258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Работа такая, все поменять могут только технологи, а для этого кучу писям надо написать, каждые спецы за свои программы отвечают, а придется переставлять все, вообщем тонна бумаги и неделя и без компьютера
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Так этот .GetRows со своими параметрами решает все мои проблемы (во всяком случае на сегодняшний день)...
...а насчет Bookmark в Recordset, если не трудно, объясни подробнее:)
258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Каждый открытый Recordset имеет одну закладку - она ВСЕГДА указывает на текущую запись. Это свойство rst.Bookmark . Это значение можно считать/сохранить во внешнюю переменную:

Dim varBook as Variaте
varBook=rst.Bookmark

(ВНИМАНИЕ: переменная varBook представляет собой положительное число от 0 до 4294967295. Т.е. это по сути сдвинутый в положительную область тип данных Long. Посколько такого типа данных нет, то его заменяет Variant, поэтому все закладки - Variant)

После сохранения в переменной, можно быстро перейти на нужную запись. Для этого надо свойству rst.Bookmark присвоить сохраненную закладку:
rst.Bookmark=varBook

Т.е. свойство rst.Bookmark служит для чтения/сохранения закладки так и для установки/перемещения к ней.
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
To SergeySV:
Огромное спасибо за подробное объяснение:)
:-? а у КомбоБокса случайно нет параметра, который принимает массив?
478
12 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by XtreamAll
To SergeySV:
Огромное спасибо за подробное объяснение:)
:-? а у КомбоБокса случайно нет параметра, который принимает массив?



Нашел Комбик с такими-же параметрами, как и ЛистБокс...:}

258
12 ноября 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll


Нашел Комбик с такими-же параметрами, как и ЛистБокс...:}



Они близнецы братья.

239
12 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by XtreamAll


Нашел Комбик с такими-же параметрами, как и ЛистБокс...:}



Не понимаю, в чем тут вообще может возникнуть проблема?! Берете рекордсет, проверяете на БОФ, после чего делаете мов ферст. в цикле, пока не ЕОФ, делаете:
listitem = lvwList.listitems.add()
listitem.subitems(1) = "текст 2-го столбца"
listitem.subitems(2) = "текст 3-го столбца"
rst.movenext
Все!

Кстати, о птичках, лучше пользоваться move чем find.

478
13 ноября 2003 года
XtreamAll
279 / / 01.10.2003
To Dolonet:

Надо учитывать, что далеко не у всех контролов есть такие параметры...
...я таких контролов не знаю...
...подскажешь?
239
13 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by XtreamAll
To Dolonet:

Надо учитывать, что далеко не у всех контролов есть такие параметры...
...я таких контролов не знаю...
...подскажешь?



Это один из 2-х вообще мне известных контролов... Причем второй, скорее всего, не известен никому из читателей... Меня несколько удивило, что о первом Вы не знаете.
Если Вы работаете в VB6, то это надо присоединить компонент Microsoft Windows Common Controls 6.0 (sp4 например). Там и лежит такой контрол ListView. В MSDN, смотрю, по нему море доки.

Удачи!

478
14 ноября 2003 года
XtreamAll
279 / / 01.10.2003
Если Вы работаете в VB6, то это надо присоединить компонент Microsoft Windows Common Controls 6.0 (sp4 например). Там и лежит такой контрол ListView. В MSDN, смотрю, по нему море доки.


Пасиба!!!
К сожалению на работе у меня стоит VB6, и он без MSDN...
...но, я думаю, разберусь:)
239
14 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Если очень понадобится, я могу какой-нибуть наглядный примерчик смастерить... %) Всегда, как говорится, к вашим услугам %)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог