Форум: "Базы";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
Внизнастоящий ComboBox в DBGride Найти похожие ветки
← →
Инна (2003-05-06 02:18) [0]как сделать, чтобы настоящий комбобокс был ячейкой? настоящий в смысле - с той возможностью хранить ID (как здесь объяснялось как-то), а не только имена. я знаю, как сделать так, чтобы был выпадающий соответсвующий список, но потом тогда придется искать в таблице сообтветсвующий ID :((( не хотелось бы лишнего писать. Спасибо!
← →
Zacho (2003-05-06 06:34) [1]
> Инна (06.05.03 02:18)
Не совсем понял вопрос, но может быть подойдет обычное lookup поле в DataSet"е ?
← →
VAleksey (2003-05-06 08:56) [2]Посмотри в книгах про поля lookup
← →
Sergey Masloff (2003-05-06 09:04) [3]Усли не хочется lookup (а на это могут быть причины) то на событие OnDrawColumnCell можно нарисовать поверх ячейки что угодно - в том числе и обычный ComboBox.
← →
Инна (2003-05-06 11:13) [4]да мне вроде лукап ни к чему. а как вот "то на событие OnDrawColumnCell можно нарисовать поверх ячейки что угодно - в том числе и обычный ComboBox."? я думаю этим вопросом довтали точно так же как и вопросом про цветной грид :), может статья какая есть? :)
← →
Mike Kouzmine (2003-05-06 11:15) [5]А ячейка и есть комбобокс. Смотри PickList или что-то в этом роде.
← →
Инна (2003-05-06 11:24) [6]Mike, если Вы про свойство в Columns, то я знаю, если нет, то не знаю. напишите, плз, подробней
← →
Sergey Masloff (2003-05-06 11:33) [7]Mike Kouzmine ©
>А ячейка и есть комбобокс...
Тут несколько не то. Насколько я понял, есть желание записывать в Objects какие-то данные, и при выборе значения в базу вставлять не Strings[i] а Objects[i]. Так вот при использовании PickList это не совсем просто, так ведь? ;-))
← →
Sergey (2003-05-06 11:47) [8]Masloff - дело говорит! Есть у комбобокса и гридовской ячейки что-то типа Баундс (точно не помню). Вот баундсы комбобокса надо к баундсам ячейки прилудить - это на ОнДроу, а в "других случаях" комбобокс делать инвизиблом! Такая ботва в Тейкстре и Ксавье, по-моему, балы подробно с примером описана.
← →
Mike Kouzmine (2003-05-06 12:04) [9]Ну так и сделай список объектов, а при onchange в реальное поле вставляй из списка по ItemIndex.
← →
Oops (2003-05-06 12:05) [10]Поставить Active=false для таблицы.
Даблклік на таблице (TTable) в которую надо вставить комбобокс,
клик правой кнопкой мыши по открывшемуся окну. Выбрать New Field (Ctrl+N). Выставить имя для нового поля, тип, Field Type поставить в "Lookup".
Key Fields - ID для лукапа,
Dataset - из какаго датасета выбирать поля для подстановки
Lookup Keys - значение какого поля должно пойти в датасет когда юзер чтото выберет из комбо бокса
Result Field - какое поле подставлять вместо указаного в Key Fiedls
Если у нас таблицы: item(iID,iName) move(mID,....);
и надо вместо в таблицу move подставлять вместо mID название етого mID, то получим:
Key Fields - mID,
Dataset - item
Lookup Keys - iID
Result Field - iName
Поставить Active=true для таблицы.
Больше в хелпе :)
← →
Mike Kouzmine (2003-05-06 12:07) [11]только не onchange.
Хотя я бы сделал через Popup меню.
← →
Sergey Masloff (2003-05-06 12:24) [12]Mike Kouzmine © (06.05.03 12:04)
>Ну так и сделай список объектов, а при onchange
>только не onchange.
так вот OnЧТО? ;-)
Oops ©
Все эти lookup потенциально ТАКИЕ тормоза что использовать их с оглядкой нужно. А есть случаи когда это вообще неприменимо.
Инна
Киньте на форму ComboBox, сделайте Visible:=False. В событии DrawColumnCell есть параметр типа TRect - прямоугольная область которую занимает ячейка. Соответственно в эту область перемещаете свой ComboBox и делаете Visible:=True. Ну и обработать пару событий. Писанины на 40 минут.
← →
Danilka (2003-05-06 12:27) [13]Oops © (06.05.03 12:05)
>Dataset - из какаго датасета выбирать поля для подстановки
если я правильно понял, никакого датасета для подстановки нет, есть два списка один, с наименованиями, который надо отображать, воторй - с id, которые надо писать в базу.
честно говоря, для этого вижу два приемлемых пути:
1. писать свой грид, наследник от стандартного, в который добавить это возможность
2. использовать то, что написано другими, например DBGridEh - бесплатный для русскоговорящих. :)) в нем это реализовано ввиде двух свойств: KeyList и PickList
← →
Danilka (2003-05-06 12:29) [14]Sergey Masloff (06.05.03 12:24)
прокатит, но как-то некрасиво, да и отображаться в столбце все равно будет id, хотя, есть варианты.
← →
Sergey Masloff (2003-05-06 12:44) [15]Danilka ©
Прокатит еще как. И в столбце будет отображаться что нужно - думаешь, я не пробовал ;-) ID писать в invisible столбец естественно. Кроме того, я не пользовался DBGridEh но не уверен что там реализована наличествующая у меня возможность изменять вываливаемый пользователю список не только в зависимости от "столбца" но и от "строки". Только не надо говорить что это никогда не нужно - нужно сплошь и рядом. Например, в гриде список людей. И выпадающие списки должны быть разными в зависимости от того взрослый это или ребенок ;-)
← →
Danilka (2003-05-06 13:13) [16]Sergey Masloff (06.05.03 12:44)
>ID писать в invisible столбец
ну, это я и имел ввиду, когда писал про варианты :))
← →
Инна (2003-05-06 23:58) [17]все вставилось :) такой вопрос возник: можно ли как-нить данные сначала только отображать, а не сразу отправлять на сервер? т.е. юзер выбрал в нескольких ячйках и только потом оправлять на сервер? или только через вставку записи сразу в таблицу?
если интересно, то код (правда, кривовато как-то отображается... не тютелька-в-тютельку):
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (gdSelected in State) and (DBGrid1.SelectedField.FieldName="nm") then
with DBComboBox1 do
begin
Left := Rect.Left + DBGrid1.Left;
Top := Rect.Top + DBGrid1.top;
Width := Rect.Right - Rect.Left;
Height := Rect.Bottom - Rect.Top;
Visible := True;
SetFocus;
end
← →
Danilka (2003-05-07 08:38) [18]Инна (06.05.03 23:58)
ну, можно немножко проще, у каждого насленика TWinControl есть свойство BoundsRect, можно переписать так:
with DBComboBox1 do
begin
BoundsRect:=Rect;
Visible := True;
SetFocus;
end;
а на счет данные сначала отображать, для этого есть Database.StartTransaction / Commit, про это посмотри в хелпе у TDatabase
← →
NAlexey (2003-05-07 08:59) [19]Можно вопрос задать:
а вот это вот
with DBComboBox1 do
получается что у вас комбобокс уже созданный? и просто болтается гдето инвизибле? И в определенное время, когда открывается InplaceEditor, вы его в нужном месте бабах и показали? Не терзают вас смутные сомнение что это не совсем правильно как то?
← →
Danilka (2003-05-07 09:17) [20]NAlexey © (07.05.03 08:59)
а что, InplaceEditor каждый раз заново создается? ;))
← →
Sergey Masloff (2003-05-07 09:18) [21]NAlexey © (07.05.03 08:59)
>Можно вопрос задать:
>а вот это вот
>with DBComboBox1 do получается что у вас комбобокс уже >созданный?
Ну естественно. И это самый правильный путь. Совершенно стандартная ситуация. Более того, создан он возможно и в далекой базовой форме - предке.
>Не терзают вас смутные сомнение что это не совсем правильно как >то?
Аргументы не совсем правильности в студию!
← →
Danilka (2003-05-07 09:18) [22]NAlexey © (07.05.03 08:59)
хотя, согласен, что правильнее было-бы свой InplaceEditor нарисовать с необходимой функциональностью.
← →
Инна (2003-05-07 13:12) [23]а у меня в BoundsRect:=Rect; почему-то не работает :( не ставится в ячейку.
и я через ADO связываюсь, там нет компонента DataBase.
← →
Danilka (2003-05-07 13:26) [24]Инна (07.05.03 13:12)
да, с BoundsRect, похоже, я прогнал, сорри :))
а в АДО тоже доступны транзакции:
TADOConnection.BeginTrans
TADOConnection.CommitTrans
TADOConnection.RollbackTrans
← →
Инна (2003-05-07 13:37) [25]я чего-то не понимаю... ну хорошо, пусть мы записываем данные до начала тарнзакции, но куда? я так понимаю, что в "просто" DBgrid их записать нельзя, a чтобы они появились в ADODataSet, нужно чтобы они уже были в таблице на серваке, т.к. они оттуда берутся для ADODataSet...
← →
Danilka (2003-05-07 13:40) [26]Инна (07.05.03 13:37)
нет, мы стартуем транзакцию, пишем данные на сервер, но сервер их никому не покажет пока мы не сделаем commit. если же мы сделаем rollback, то сервер забудет про все изменения.
← →
Инна (2003-05-07 14:03) [27]пойду, почитаю умное на тему, т.к. "но сервер их никому не покажет" вызывает вопросы :) всем спасибо за помощь!
← →
Danilka (2003-05-07 14:26) [28]Инна (07.05.03 14:03)
старался обьяснить попроще. :))
Когда стартует транзакция, то она получает "снимок" сервера на момент старта.
Все изменения что она делает, происходят в этом "снимке", никакие другие клиенты этих изменений не видят.
Транзакцию можно завершить двумя способами:
Commit - мы говорим, что все изменения правильные, они становятся доступны для всех.
Rollback - все что мы делали с базой после старта транзакции будет отменено.
Вообще-то транзакции бывают разные, есть разные уровни изоляции, но пока хватит и этого. :))
← →
Sergey Kornilov (2003-05-08 08:19) [29]А чем вас не устраивает настоящий ComboBox в DBGride? Вернее свойство ячейки PickList. Мне недавно нужно было программно данные из базы данных скидывать. Так очень просто получилось:
Объявляем переменную
var
MyList: TStringList;
.....
MyList := TStringList.Create;
заполняем MyList каким угодно способом
и наконец, для примера
DBGrid_Vagon_izm.Columns[12].PickList.AddStrings(MyList);
finally
MyList.Free;
end;
и всё.
← →
NAlexey (2003-05-08 09:05) [30]>DBGrid_Vagon_izm.Columns[ 12].PickList.AddStrings(MyList);
Верно, но чтобы потомки не гневились, всеиаки жёсктко значимые значения надо стараться избегать использовать. Красота спасет мир таки...
← →
Sergey Masloff (2003-05-09 19:21) [31]Sergey Kornilov
>MyList := TStringList.Create;
Это все бессмысленно. В PickList и так есть TStrings и если его возможностей хватает то еще один создавать не нужно.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.008 c