C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Выпадающий список в DBGrid, Как создать выпадающий список в ячейке
welcome
  Отправлено: 01.06.2004, 09:20


Ученик-кочегар

Группа: Участник
Сообщений: 8



Предположим есть две таблицы:
Table1:\ Name1 \ Phone\
Table2:\ Name2 \ Dep \

Table2 выводиться на редактирование в DBGRid
Надо сделать так чтобы в поле Name2 таблицы Table2 можно было бы ввести только те значения которые содержаться в поле Name1 таблицы Table1 ПРИЧЁМ необходимо чтобы допустимые значения можно было выбирать из выпадающего списка. Выпадающий список надо формировать динамически — т.е. в этом списке должен выводиться результат запроса :
SELECT Name1 FROM Table1

ВОПРОС: Как это реализовать?
olegenty
Отправлено: 01.06.2004, 09:33


Ветеран

Группа: Модератор
Сообщений: 2412



1. Устнановить EhLib
2. У датасета объявить Lookup поле
3. Создать у DBGridEh постоянные колонки
4. Настроить колонку с Lookup полем на соответствующий датасет
5. Насладиться результатом раюоты
AVC
Отправлено: 01.06.2004, 12:03


Ветеран

Группа: Модератор
Сообщений: 1583



Если все таки требуется работать через DBGrid
1. Если выпадающий список одинаков для всех строк — заполнить DBGrid->Colums->Item[??]->PickList заранее.
2.Если список зависит от текущей строки Table2 то выполнить Select и см.1. Момент смены строк хорошо ловится DBGrid->DataSource->OnDataChange.
3.Разработать свою форму для выбора из списка.
Предупреждение: в большинстве систем показывать нужно одно (название), а запоминать в таблице другое (код). В этом случае PickList не спасает.
olegenty
Отправлено: 01.06.2004, 12:21


Ветеран

Группа: Модератор
Сообщений: 2412



если требуется работать с DBGrid (уж не представляю, откуда такое ограничение при бесплатности EhLib), то про PickList и думать забудте, Lookup поля и тут решат решат все ваши проблемы, просто для них более скудные возможности.
welcome
  Отправлено: 02.06.2004, 10:34


Ученик-кочегар

Группа: Участник
Сообщений: 8



QUOTE (olegenty @ 01/06/2004, 10:35)
2. У датасета объявить Lookup поле
3. Создать у DBGridEh постоянные колонки
4. Настроить колонку с Lookup полем на соответствующий датасет
5. Насладиться результатом раюоты

Что значит "Создать у DBGridEh постоянные колонки"??? Дело в том что у меня в одном и том же Grid в зависимости от выбора пользователя выводяться разные таблицы с разным количеством столбцов. Так что постоянное число колонок мне нне подходит.
Где искать это Lookup поле? и как его объявить???

Прошу прощения за возможно глупые вопросы но я пока новечок в Builder-e
olegenty
Отправлено: 02.06.2004, 10:42


Ветеран

Группа: Модератор
Сообщений: 2412



Lookup поле создаётся руками в редакторе полей набора данных (любого наследника TDataSet)

если несколько таблиц отображается в одном гриде, то
1. можно всё так и оставить
2. можно в Runtime производить все настройки, которые можно было сделать руками в Designtime. для этого просто надо почитать help к EhLib.
welcome
Отправлено: 02.06.2004, 13:09


Ученик-кочегар

Группа: Участник
Сообщений: 8



QUOTE (AVC @ 01/06/2004, 13:05)
Если все таки требуется работать через DBGrid
1. Если выпадающий список одинаков для всех строк — заполнить DBGrid->Colums->Item[??]->PickList заранее.
2.Если список зависит от текущей строки Table2 то выполнить Select и см.1. Момент смены строк хорошо ловится DBGrid->DataSource->OnDataChange.
3.Разработать свою форму для выбора из списка.
Предупреждение: в большинстве систем показывать нужно одно (название), а запоминать в таблице другое (код). В этом случае PickList не спасает.

А как в PickList записать результат SQL запроса ???
welcome
  Отправлено: 02.06.2004, 13:18


Ученик-кочегар

Группа: Участник
Сообщений: 8



QUOTE (olegenty @ 02/06/2004, 11:44)
Lookup поле создаётся руками в редакторе полей набора данных (любого наследника TDataSet)

если несколько таблиц отображается в одном гриде, то
1. можно всё так и оставить
2. можно в Runtime производить все настройки, которые можно было сделать руками в Designtime. для этого просто надо почитать help к EhLib.

Отыскал, настроил (статически) — не работает

В редакторе поле установил поля таблицы, всвойствах поле нашёл поле LookupDataSet в нём указал источник данных Query в нём написал запрос результат которого мне нужен в выпадающем списке и...
и не работает.
Как сделать чтобы заработало?? Чтобы в ячейки выводился выподающий список (PickList) содержащий результат запроса???

PickList работает но как туба запихать результат запроса??? или как результат запроса присвоить некой перменной??
AVC
Отправлено: 02.06.2004, 13:18


Ветеран

Группа: Модератор
Сообщений: 1583



Руками. PickList это обйчный TStrings — пройти в цикле по всем записям и выполнить Add или накопить строку и заполнить Text.
Советую прислушаться к советам olegenty. Работа с "чистым" TDBGid'ом достаточно сложна.
olegenty
Отправлено: 02.06.2004, 13:22


Ветеран

Группа: Модератор
Сообщений: 2412



руками в цикле по формирующему запросу.
welcome
  Отправлено: 02.06.2004, 13:38


Ученик-кочегар

Группа: Участник
Сообщений: 8



QUOTE (AVC @ 02/06/2004, 14:20)
Руками. PickList это обйчный TStrings — пройти в цикле по всем записям и выполнить Add или накопить строку и заполнить Text.
Советую прислушаться к советам olegenty. Работа с "чистым" TDBGid'ом достаточно сложна.

Это понятно что руками вопрос в другом — как получить эти самые записи??
т.е. предположим
Query1->SQL->Clear();
Query1->SQL->Add("select FirmName from Firms");
Так вот как из этого Query получить количество строк (для организации цикла) и соответсвенно как эти строки выуживать???
AVC
Отправлено: 02.06.2004, 13:48


Ветеран

Группа: Модератор
Сообщений: 1583



Примерно так (читайте Help или учебник).
CODE

TDataSet *qry = Query1;
TField *fld = qry->FieldByName("???");
// проверки на вашей совести
AnsiString text = "";
bool b = false;
for (qry->First(); !qry->Eof; qry->Next())
{ if (b) text += "\n";
  b = true;
  text += fld->AsString;
}
...->PickList->Text = text;

Gedeon
Отправлено: 02.06.2004, 13:52


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (welcome @ 02/06/2004, 14:40)
Так вот как из этого Query получить количество строк (для организации цикла) и соответсвенно как эти строки выуживать???

CODE

Query1->SQL->Count // кол-во строк
Query1->SQL->Strings[3] // четвертая строка
AVC
Отправлено: 02.06.2004, 13:58


Ветеран

Группа: Модератор
Сообщений: 1583



Я првильно понял — имелись в виду строки результирующего запроса? Если нет — смотрите у Gedeon.
welcome
Отправлено: 02.06.2004, 14:04


Ученик-кочегар

Группа: Участник
Сообщений: 8



QUOTE (Gedeon @ 02/06/2004, 14:54)
QUOTE (welcome @ 02/06/2004, 14:40)
Так вот как из этого Query получить количество строк (для организации цикла) и соответсвенно как эти строки выуживать???

CODE

Query1->SQL->Count // кол-во строк
Query1->SQL->Strings[3] // четвертая строка

Имелось введу не количесво строк самого запроса,а количество строк результата этого запроса т.е. в результате запроса
SELECT Name FROM Table1
Будет список имён так вот надо выяснить количество записей в этом списке и выуживать их от туда по одному
Gedeon
Отправлено: 02.06.2004, 14:14


Ветеран

Группа: Модератор
Сообщений: 1742



Query1->RecordCount;
Хэлп помогает.

Хотя нафига Вам их количество AVC привел Вам пример организации цикла, кстати мне понравилось я обычно через while делал, так красивее.

Отредактировано Gedeon — 02/06/2004, 15:20
olegenty
Отправлено: 02.06.2004, 14:15


Ветеран

Группа: Модератор
Сообщений: 2412



Вот код, но ребят, Lookup поля рульнее во сто крат, ты же сказал, что у тебя в гриде могут разные таблицы отражасться. Но офигеешь контролировать свойства колонок в Runtime? Мне кажется, чтобы это делать, тебе невредно матчасть подучить, и предпочтение PickList Lookup полям должно быть очень осознанным и аргументированным не по детски...

CODE

QryForPickList->Open();
Grid->Columns->Items[<Номер нужной колонки>]->PickList->Clear();
while (!QryForPickList->Eof)
{
   Grid->Columns->Items[<Номер нужной колонки>]->PickList->Add(QryForPickList->FieldByName("<Имя колонки для формирования выпадающего списка>")-AsString);
   QryForPickList->Next();
}
** welcome
Отправлено: 03.06.2004, 09:44


Не зарегистрирован







QUOTE (olegenty @ 02/06/2004, 15:17)
ребят, Lookup поля рульнее во сто крат, ты же сказал, что у тебя в гриде могут разные таблицы отражасться. Но офигеешь контролировать свойства колонок в Runtime? Мне кажется, чтобы это делать, тебе невредно матчасть подучить, и предпочтение PickList Lookup полям должно быть очень осознанным и аргументированным не по детски...

Как работает PickList я понял и он выполняет то что мне надо именно поэтому я сейчас этим и воспользовался. Как воспользоваться Lookup мне пока не понятно.
В редакторе поле установил поля таблицы, всвойствах поле нашёл поле LookupDataSet в нём указал источник данных Query в нём написал запрос результат которого мне нужен в выпадающем списке и...
и не работает.

Так что я не против Lookup но как он работает пока не понимаю....
olegenty
Отправлено: 03.06.2004, 11:14


Ветеран

Группа: Модератор
Сообщений: 2412



если вопрос только в этом, то слушай.
1. В редакторе полей Add all fields
2. В редакторе полей New field
3. Заплняешь атрибуты вновь создаваемого поля:
3.1. Name — имя твоего нового поля
3.2. Type — тип, подставляешь тот тип, который будет в выпадающем списке
3.3. Size — если поле предполагает размер, та же строка, то указываешь размер (для строки — в символах)
3.4. Field Type — Lookup
3.5. KeyFields — поля/поле, по которому/которым будет ассоциироваться набор данных, который ты хотел поместить в PickList
3.6. Dataset — тот набор данных, из которого ты хотел поместить данные в PickList
3.7. Lookup keys — набор полей/поле, по которым/которому вяжутся твой набор данных и набор данных, вываливающийся в списке. логически тот же набор, что и в KeyFields, только из набора данных, которым ты хотел заполнить PickList
3.8. Result Field — поле для отображения в выпадающем списке, типа Type, длинной Size

всё. больше ничего делать не надо. Grid сам сделает все необходимые действия, чтобы отобразить выпадающий список... smile.gif
welcome
  Отправлено: 03.06.2004, 11:48


Ученик-кочегар

Группа: Участник
Сообщений: 8



QUOTE (olegenty @ 03/06/2004, 12:16)
всё. больше ничего делать не надо. Grid сам сделает все необходимые действия, чтобы отобразить выпадающий список... smile.gif

Большое спасибо — теперь я понял как это делается — всё работает
olegenty
Отправлено: 03.06.2004, 15:53


Ветеран

Группа: Модератор
Сообщений: 2412



Как видишь, вопрос-то был плёвый, на несколько кликов мышью biggrin.gif
** welcome
Отправлено: 04.06.2004, 13:11


Не зарегистрирован







Хотя кое что не понятно
описанный способ добавляет новое поле к таблице а вот как сделать так чтобы выпадающий список находился не в другом поле а именно в поле Name точно так же как в случае с PickList ?

и вопрос номер два
как разрешить ввод значения в ячейку только из выпадающего списка, т.е. можно выбирать из выпадающего списка, можно самому вводить но только те значения которые есть в выпадающем списке. Так вот как это сделать програмнным путём (без связывания полей на уровне таблиц БД) ?
** welcome
  Отправлено: 04.06.2004, 13:11


Не зарегистрирован







Хотя кое что не понятно
описанный способ добавляет новое поле к таблице а вот как сделать так чтобы выпадающий список находился не в другом поле а именно в поле Name точно так же как в случае с PickList ?

и вопрос номер два
как разрешить ввод значения в ячейку только из выпадающего списка, т.е. можно выбирать из выпадающего списка, можно самому вводить но только те значения которые есть в выпадающем списке. Так вот как это сделать програмнным путём (без связывания полей на уровне таблиц БД) ?
olegenty
Отправлено: 04.06.2004, 13:20


Ветеран

Группа: Модератор
Сообщений: 2412



QUOTE

Хотя кое что не понятно
описанный способ добавляет новое поле к таблице а вот как сделать так чтобы выпадающий список находился не в другом поле а именно в поле Name точно так же как в случае с PickList

значение подставляется в поле/поля KeyFields, так что тут проблемы нет, всё работает именно так, как надо. просто, в твоём случае, если у тебя там именно Name, то у тебя и KeyFields и Lookup keys и Result field = Name. при этом оригинал в гриде скрой, а Lookup оставь, и всё будет работать правильно.

и ввести туда что-либо левое, в случае наличия внешнего ключа, ты ничего не сможешь.
olegenty
Отправлено: 04.06.2004, 13:26


Ветеран

Группа: Модератор
Сообщений: 2412



и почитай уже наконец help/теорию biggrin.gif а то тычешь пальцем в небо...

Вернуться в Работа с базами данных в C++Builder