Форум » GUI » Combobox » Ответить

Combobox

Новичок: в ComboBox при использовании с базой данных ItemSource <Список> и ValueSource <Коды> при выборе из <Списка> корректно дает соответствующие <Коды> вопрос: как при указанном <Коде> указать элемент в <Списке>, (использование .Value:=<n> - это порядковый номер <Списка>, а .ValueSorce:=<n> отсутствует) Пример: БД (test.dbf) Код Наименование Code Name ------ ------- 3 Иванов 15 Петров 2209 Сидоров если применить @ ...combobox... ItemSource test->Name ValueSource test->Code ... Появится список: Иванов Петров Сидоров И если выбрать в списке <Сидоров>, то результат KODE:=.combobox.value даст KODE = 2209 (правильно) а если уже наоборот присвоить к .combobox.value := 2209, то <Список> уже пустой, а должен был быть <Сидоров> конечно понимаю Value присваивается порядковый номер элемента, а так как элементов в списке только 3... Но тогда, может быть ввести ValueSource ? Конечно, если в поле Code будут последовательные коды 1,2,3...n тогда работает, но не практично сами понимаете В итоге приходится либо обходить, либо свой элемент создавать. И как было задумано, может где-то что-то пропускаю ? *также заметил если при присваивании Value значение больше элементов в списке, то список не обновляется, а остается предыдущий выбранный элемент, логичней будет наверно если значение больше чем элементов в списке то присваивать 0 (ноль) ? а то приходится, писать такой прикол ... Windows.ComboBox.Value := 0 а потом уже только присваивать значение Windows.ComboBox.Value := <n> и если <n> превысить кол-во в списке, то в списке будет пустой элемент

Ответов - 5

Andrey: Новичок пишет: также заметил если при присваивании Value значение больше элементов в списке, то список не обновляется, а остается предыдущий выбранный элемент, логичней будет наверно если значение больше чем элементов в списке то присваивать 0 (ноль) ? а то приходится, писать такой прикол Пиши маленький самодостаточный пример. Без него не понять что хочешь получить ! Смотри примеры по ComboBox - там всё есть.

Haz: Новичок пишет: если уже наоборот присвоить к .combobox.value := 2209, Value в комбике , это recno() , так исторически сложилось и оставлено для совместимости. Если нужно позиционировать по определенному valuesource, то сначала получаем номер записи по этому значению, а потом позиционируем.

SergKis: Haz пишет Value в комбике , это recno() Не совсем так, если ставить Filter, Scope на dbf ... Это порядковый номер в списке элементов combobox. Пример варианта работы с combobox [pre2] /* * MiniGUI ComboBox Demo */ #include "minigui.ch" Function Main Local cClr, nClr, aClr Local aItems := { 'RED', 'BLUE', 'GREEN', 'YELLOW' } Local aClrA := { RED , BLUE , GREEN , YELLOW } Local aClrN := { CLR_RED , CLR_BLUE , CLR_GREEN , CLR_YELLOW } DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 200 ; TITLE 'ComboBox Demo' ; MAIN DEFINE MAIN MENU DEFINE POPUP 'Test' ITEM 'Get Value' ACTION MsgInfo(cValToChar(This.Combo_1.Value)) ITEM 'Get Value Cargo' ACTION MsgInfo(Combo_Val()) SEPARATOR ITEM 'Set Value 1' ACTION Form_1.Combo_1.Value := 1 ITEM 'Set Value 2' ACTION Form_1.Combo_1.Value := 2 ITEM 'Set Value 3' ACTION Form_1.Combo_1.Value := 3 ITEM 'Set Value 4' ACTION Form_1.Combo_1.Value := 4 SEPARATOR ITEM 'Get DisplayValue' ACTION MsgInfo( Form_1.Combo_1.DisplayValue ) END POPUP END MENU @ 15,20 COMBOBOX Combo_1 ; ITEMS aItems ; VALUE 0 ; DISPLAYEDIT ; LOWERCASE ; FONTCOLOR NAVY ; BACKCOLOR WHITE This.Combo_1.Cargo := oHmgData() WITH OBJECT This.Combo_1.Cargo FOR EACH cClr, nClr, aClr IN aItems, aClrN, aClrA :Set(cClr, { nClr, aClr }) NEXT END WITH END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Static Function Combo_Val() Local cRet := "", cNam, nClr, aClr, nPos, aTmp Local nVal := This.Combo_1.Value Local oVal := This.Combo_1.Cargo Local aNam := oVal:Keys() Local aVal := oVal:Values() cRet += cValToChar(nVal) IF nVal > 0 cNam := aNam[ nVal ] nClr := aVal[ nVal ][1] aClr := aVal[ nVal ][2] nPos := oVal:Pos(cNam) nVal := oVal:Pos( This.Combo_1.DisplayValue ) aTmp := oVal:Get( This.Combo_1.DisplayValue, {,} ) cRet += ": "+cNam+" "+cValToChar(nClr)+" "+hb_valtoexp(aClr)+ ; " "+cValToChar(nPos)+" "+cValToChar(nVal)+" "+hb_valtoexp(aTmp) aTmp := oVal:GetAll() cRet += CRLF+CRLF + StrTran(hb_valtoexp(aTmp), "},", "},"+CRLF) cRet += CRLF+CRLF+hb_valtoexp(aTmp[ nVal ]) ENDIF Return cRet [/pre2] Добавил в пример еще варианты доступа к данным из :Cargo в combobox


Haz: SergKis пишет: Это порядковый номер в списке да, согласен. Почему то засел в голове номер записи. Когда то использовал этот контрол с базой. Отказался лет пять назад т.к. функционал слишком не устроил. С коротким выбором по массиву из значений типа ( да, нет, не знаю) работать можно. С базой работаю через свой аналог на tsb

SergKis: Haz пишет С базой работаю через свой аналог на tsb Аналогично, можно еще добавить колонки и поиски с переключением тэга, т.е. не отличается схема работы от др. таблиц. С коротким выбором по массиву из значений типа ( да, нет, не знаю) работать можно. Но надо ставить NOTABSTOP, иначе можно легко сменить значение в combobox стрелками вверх\вниз, не заметив этого



полная версия страницы