:: Visual Foxpro, Foxpro for DOS
отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Анонимный пользователь
Автор
Пятый час кряду мучаюсь...
Есть комбо, который сидит на крусоре curEntHeads. В комбе отображаются 3 столбца (по факту 2, первый 0-длины).
Егойные свойства:
ColumnCount = 2
DisplayValue = "=peopl_snam" (без скобок)
RowSource = curEntHeads
RowSourceType = 2
В курсоре три поля, нужно, чтобы Value комбы моталось по первому полю, но после выбора в нем отображалось значение второго поля.
Все делаю по МСДНу: в InteractiveChange комбы прописываю
This.DisplayValue = This.List(This.ListIndex,2)
Получается следующее: по чейнджу до строки с изменой DisplayValue = значению первого столбца (скрытого, 0-ширины), Value - то же самое. После обновления DisplayValue вышеуказаной строкой DisplayValue становится нужного значения (значения второго столбца), а Value пугается и становится "".
Самое веселое - то же самое пустое значение отображается в едите комбы!
Помогите люди добрые - кто как думает, где собака порылась?

Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
AnatolyS

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
Если на курсоре, то настройка комбо должна быть примерно такой:

with Thisform.Combo
.BountTo = .t.
.BoundColumn = 3
.RowSourceType = 0
.ColumnLines = .t.
.ColumnCount = 3
.ColumnWidths = "200, 100, 0"
.RowSource = "curEntHeads.displayfield1,displayfield2, boundedfield"
.RowSourceType = 6
endwith
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Анонимный пользователь
Автор
Спасибо, конечно... все равно нифига не работает!
А зачем вот это

RowSource = "curEntHeads.displayfield1,displayfield2, boundedfield"

если комба и так берет три столбца? Разве ColumnCount = 3 не достаточно?
И еще почему RowSourceType = 6 - Filds, если мне нужен алиас? Какая особая разница?
Все это перепробовал... не-а!

Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
AnatolyS

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
Вот рабочий пример:

public goTest
goTest = createobject('test')
goTest.Show
DEFINE CLASS test AS form
DoCreate = .T.
Caption = "Form1"
Name = "Form1"
ADD OBJECT combo1 AS combobox WITH ;
BoundColumn = 3, ;
ColumnCount = 3, ;
ColumnWidths = "100,100,0", ;
RowSourceType = 6, ;
RowSource = "ttest.name1,name2,id", ;
Value = 0, ;
Height = 24, ;
Left = 36, ;
Style = 2, ;
Top = 48, ;
Width = 324, ;
BoundTo = .T., ;
Name = "Combo1"
ADD OBJECT label1 AS label WITH ;
Caption = "Label1", ;
Height = 17, ;
Left = 36, ;
Top = 96, ;
Width = 324, ;
Name = "Label1"
PROCEDURE Load
set compatible off
create cursor ttest (id i, name1 c(10), name2 c(10))
insert into ttest values (10, "n1", "f11")
insert into ttest values (20, "n2", "f22")
ENDPROC
PROCEDURE combo1.InteractiveChange
Thisform.Label1.Caption = transform(This.Value) + "=" + alltrim(This.DisplayValue)
ENDPROC
ENDDEFINE
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Анонимный пользователь
Автор
Гм!..
Я понимаю, что пример работает...
Но зачем мне нужен дополнительный Lable на форме, если там и так места нет?Мне нужно выводить значение в Edit Cobobox-а...
Может, есть еще какие идеи?

Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Цитата:
Пятый час кряду мучаюсь...
Заметно , поскольку практически ничего не понял из пояснения. Поэтому просто несколько замечаний к сведению.

Значение Value присваивается (выбирается) из того столбца, который указан в свойстве BoundColumn. Это порядковый номер из RowSource.
Содержимое DisplayValue присваивается (выбирается) всегда только и исключительно из первого столбца RowSource.

У тебя есть курсор, содержащий 3 поля. Тебе нужно:

Value выбирается по значению первого поля этого курсора, но само это первое поле не должно отображаться в выпадающем списке.
Собственно выбор элемента визуально (DisplayValue) должен осуществляться по значению второго поля.
3 поле курсора - роли не играет и его можно не отображать.

Поскольку надо отобразить поля не в "естесственной" последовательности, да и вообще не все поля курсора, то в качестве источника данных для ComboBox выбираем

RowSourceType = 6 - Fields

В списке полей на первом месте должно стоять то, что надо отображать как выбранный элемент (DisplayValue). В данном случае - это второе поле. Порядок следования остальных полей не важен.

RowSource = "MyTable.Field2, Field1"

Именно так, алиас таблицы указан только для первого поля

Чтобы указать, что значение Value следует брать из второго поля, указанного в RowSource делаем настройку

BoundColumn = 2

А чтобы это второе поле не отображалось в раскрывающемся списке устанавливаем его ширину равной нулю

ColumnWidth = "100,0"

Если ColumnCount осталось в значении по умолчанию (0), то ширину столбцов можно не указывать. Будет отображен только первый столбец с шириной равной ширине самого ComboBox.

Если поле курсора, значение которого присваивается в Value (в данном случае Field1) имеет числовой тип данных, то следует сделать еще одну настройку

BoundTo = .T.



Отредактировано (13.05.05 12:20)


------------------
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
AnatolyS

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
Послушай, Label я привел исключительно для показа работоспособности комбо. В примере третий стоблец привязан к Value, а первый столбец к DisplayValue - так зачем еще какие-то манипуляции для переприсваивания DisplayValue и так уже содержащего выбранный объект?
Или ты хочешь, чтобы в DisplayValue отображалось содержимое второго столбца? Так это не возможно в принципе - DisplayValue всегда привязывается к первому столбцу.
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Анонимный пользователь
Автор
Владимир, !
Однозначно: вам уготовано писать бестеллер. Базиян с Пэддоком нервно курят в коридоре
Великолепное объяснение, все вышло замечательно!
Анатолий, вам тоже санкс - просто я без пояснений в вашем коде изюминку проглядел

По ходу работы возник вопрос: а нельзя ли исхитриться и в значении Edit-а выодить строковую сумму двух столбцов курсора? У меня там как раз в одном имя, а в другом должность...

Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Цитата:
По ходу работы возник вопрос: а нельзя ли исхитриться и в значении Edit-а выодить строковую сумму двух столбцов курсора? У меня там как раз в одном имя, а в другом должность...
Да запросто.

Просто надо помнить о том, что в качестве DisplayValue всегда выводиться содержимое первого столбца RowSource. Значит надо просто сформировать этот первый столбец нужным нам образом, а если его отображение в выпадающем списке не нужно, то установить его ширину равную 0.

ColumnWidth = "0,100,0"

Однако для этого придется изменить тип источника данных (RowSourceType), поскольку непосредственно в таблице нужного нам значения нет, а написать функцию в качестве источника - не получится.

Простейшее решение - это сделать выборку в курсор или массив, сформировав нужное значение первого столбца и использовать результат этой выборки в качестве источника данных для Combo.
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Burn

Сообщений: 5644
Откуда: Днепр
Дата регистрации: 02.01.2002
Цитата:
Однако для этого придется изменить тип источника данных (RowSourceType), поскольку непосредственно в таблице нужного нам значения нет, а написать функцию в качестве источника - не получится
А вот с этим не могу согласится - подобная конструкция вполнеработоспособна:
RowSourceType=6
RowSource="Str(Val(dim.di),6,2)+Iif(Empty(Val(dim.dl)), '', 'x'+Str(Val(dim.dl),3)),cod"

DIM это таблица с полями DI, DL, COD. Только у меня немного по другому - показываем мы первый столбец а в качксве VALUE - мне нужен второй



Отредактировано (13.05.05 14:56)


------------------
В борьбе бобра с козлом побеждает бобро
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Цитата:
А вот с этим не могу согласится - подобная конструкция вполнеработоспособна:
RowSourceType=6
RowSource="Str(Val(dim.di),6,2)+Iif(Empty(Val(dim.dl)), '', 'x'+Str(Val(dim.dl),3)),dim.cod"
Действительно. Когда проверял у себя просто забыл про пробелы, вот и не увидел, что tab.Field1+tab.Field2 дало результат. Просто "довесок" в виде tab.Field2 оказался вне области видимости после кучи концевых пробелов от tab.Field1
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Анонимный пользователь
Автор
Burn, санкс!
Именно это мне и нужно было - переписывать курсор под 2 столбца вместо одного уж шибко напряжно - много где дальше в коде привязка к трем...
Теперь все как у людей - "Пердседатель колхоза им. Мичурина Простокваша Н.П."

Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Sandwich

Сообщений: 137
Дата регистрации: 08.02.2014
Здравствуйте
Я тоже борюсь с поведением комбо )))
Задача:
Сделать комбо, отображающий значения полей Name курсора shops, а при выборе значения присваивал переменной id этой записи.
Сделал так:
with Thisform.Combo1
.BountTo = .t.
.BoundColumn = 2
.ColumnCount = 2
.ControlSource = pnCurrentShop
.ColumnWidths = "200, 0"
.RowSource = "shops.name, id_shop"
.RowSourceType = 6
endwith

Также для проверки рядом поставил text поле, у которого ControlSource то же pnCurrentShop

В методе InteractiveChange комбо написал
thisform.text1.Refresh

Тестинг привел к 2-м вопросам:
1. При выборе мышкой значения в комбо его InteractiveChange не срабатывает: для просмотра нового значения приходится кликать на text1, чтобы он обновился
2. Пока переменная pnCurrentShop не была объявлена явно (только в визуальном построителе) все работало правильно (кроме п. 1). Когда в вызывающем эту форму prg я объявил её как PUBLIC, добавилась еще одна странность: при выборе значений из выпадающего списка, это новое значение не отображается в комбо (т.е. визуально в нем ничего не выбрано). Хотя text1 содержит "правильный" id.
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Вот простой пример

в InteractiveChange видно:
this.Value - как раз нужный id, присваивайте кому угодно
this.DisplayValue - то что видно в комбо

И, кстати, никаких public на мой взгляд не требуется - сделайте свойство формы/класса куда и присваивайте свой id



Исправлено 2 раз(а). Последнее : AndyNigmatec, 05.10.18 13:23
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AndyNigmatec
никаких public на мой взгляд не требуется


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Sandwich

Сообщений: 137
Дата регистрации: 08.02.2014
Подождите Господа.
AndyNigmatec
в InteractiveChange видно:
this.Value - как раз нужный id, присваивайте кому угодно
this.DisplayValue - то что видно в комбо
Все это я прекрасно понимаю.
Но мой вопрос был не в том, НУЖНО или НЕ НУЖНО использовать public, а в том - что это? Мой косяк или разработчиков?
Естественно, с бубном я решу задачу
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Конкретно по твоему вопросу - значение из Value комбобокса пропихивается в его источник данных (то что указано в ControlSource) ПОСЛЕ завершения работы InteractiveChange. Соответственно рефреш в обработчике этого события будет видеть в привязанном источнике всё ещё "старое" значение, хотя в .Value уже будет видно новое (только что изменённое).
Вообще для обновления других элементов при выборе из комбо в большинстве случаев лучше использовать событие Valid - когда уже "выбор завершён", а не InteractiveChange. А в некоторых случаях и вовсе LostFocus - т.к. если логика обновления "тяжёлая", то многократный её вызов при той же прокрутке мышкой в комбо - не лучший вариант. Но если нужна такого рода "отзывчивость интерфейса" то можно сделать хитрый трюк через таймер - в InteractiveChange включать таймер с заданным интервалом (скажем, в 500мс) а уже в таймере (первым делом выключив самого себя) прописать логику обновления интерфейса - но я ещё раз повторюсь, это имеет смысл для "тяжёлой" логики - например запросы обновляющие какие-то курсоры. Для простого рефреша достаточно перенести код в Valid.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Sandwich

Сообщений: 137
Дата регистрации: 08.02.2014
Извините, Маэстро
Причем здесь Valid или LostFocus?
Мне (а точнее юзеру) нужно действие при изменении/выборе нового значения, а не при потере фокуса.
Я уже писал, что с бубном решу проблему.
Вопрос принципа: почему нужно для тривиального действия использовать этот бубен в виде таймера и пр.?
И еще: никакой "тяжелой" логики вообще нет, просто изменение значения переменной.
Почему поведение комбо зависит от "глобальности" этой переменной?



Исправлено 1 раз(а). Последнее : Sandwich, 06.10.18 15:49
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
Sandwich
Сделал так:
with Thisform.Combo1
.BountTo = .t.
.BoundColumn = 2
.ColumnCount = 2
.ControlSource = pnCurrentShop
.ControlSource = "pnCurrentShop"
.ColumnWidths = "200, 0"
.RowSource = "shops.name, id_shop"
.RowSourceType = 6
endwith
Ratings: 0 negative/0 positive
Re: отображение 2-ой колонки в ComboBox-е с несколькими столбцами
Sandwich

Сообщений: 137
Дата регистрации: 08.02.2014
? о чем это
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 51 (Гостей: 51)

© 2000-2024 Fox Club 
Яндекс.Метрика