![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
настоящий ComboBox в DBGride [D6, MSSQL]
Инна © (2003-05-06 02:18:00)как сделать, чтобы настоящий комбобокс был ячейкой? настоящий в смысле - с той возможностью хранить ID (как здесь объяснялось как-то), а не только имена. я знаю, как сделать так, чтобы был выпадающий соответсвующий список, но потом тогда придется искать в таблице сообтветсвующий ID :((( не хотелось бы лишнего писать. Спасибо!
Sergey Masloff (2003-05-09 19:21:00) [1]Sergey Kornilov
>MyList := TStringList.Create;
Это все бессмысленно. В PickList и так есть TStrings и если его возможностей хватает то еще один создавать не нужно.
NAlexey (2003-05-08 09:05:00) [2]>DBGrid_Vagon_izm.Columns[ 12].PickList.AddStrings(MyList);
Верно, но чтобы потомки не гневились, всеиаки жёсктко значимые значения надо стараться избегать использовать. Красота спасет мир таки...
Sergey Kornilov (2003-05-08 08:19:00) [3]А чем вас не устраивает настоящий ComboBox в DBGride? Вернее свойство ячейки PickList. Мне недавно нужно было программно данные из базы данных скидывать. Так очень просто получилось:
Объявляем переменную
var
MyList: TStringList;
.....
MyList := TStringList.Create;
заполняем MyList каким угодно способом
и наконец, для примера
DBGrid_Vagon_izm.Columns[12].PickList.AddStrings(MyList);
finally
MyList.Free;
end;
и всё.
Danilka (2003-05-07 14:26:00) [4]Инна (07.05.03 14:03)
старался обьяснить попроще. :))
Когда стартует транзакция, то она получает "снимок" сервера на момент старта.
Все изменения что она делает, происходят в этом "снимке", никакие другие клиенты этих изменений не видят.
Транзакцию можно завершить двумя способами:
Commit - мы говорим, что все изменения правильные, они становятся доступны для всех.
Rollback - все что мы делали с базой после старта транзакции будет отменено.
Вообще-то транзакции бывают разные, есть разные уровни изоляции, но пока хватит и этого. :))
Инна (2003-05-07 14:03:00) [5]пойду, почитаю умное на тему, т.к. "но сервер их никому не покажет" вызывает вопросы :) всем спасибо за помощь!
Danilka (2003-05-07 13:40:00) [6]Инна (07.05.03 13:37)
нет, мы стартуем транзакцию, пишем данные на сервер, но сервер их никому не покажет пока мы не сделаем commit. если же мы сделаем rollback, то сервер забудет про все изменения.
Инна (2003-05-07 13:37:00) [7]я чего-то не понимаю... ну хорошо, пусть мы записываем данные до начала тарнзакции, но куда? я так понимаю, что в "просто" DBgrid их записать нельзя, a чтобы они появились в ADODataSet, нужно чтобы они уже были в таблице на серваке, т.к. они оттуда берутся для ADODataSet...
Danilka (2003-05-07 13:26:00) [8]Инна (07.05.03 13:12)
да, с BoundsRect, похоже, я прогнал, сорри :))
а в АДО тоже доступны транзакции:
TADOConnection.BeginTrans
TADOConnection.CommitTrans
TADOConnection.RollbackTrans
Инна (2003-05-07 13:12:00) [9]а у меня в BoundsRect:=Rect; почему-то не работает :( не ставится в ячейку.
и я через ADO связываюсь, там нет компонента DataBase.
Danilka (2003-05-07 09:18:00) [10]NAlexey © (07.05.03 08:59)
хотя, согласен, что правильнее было-бы свой InplaceEditor нарисовать с необходимой функциональностью.
Sergey Masloff (2003-05-07 09:18:00) [11]NAlexey © (07.05.03 08:59)
>Можно вопрос задать:
>а вот это вот
>with DBComboBox1 do получается что у вас комбобокс уже >созданный?
Ну естественно. И это самый правильный путь. Совершенно стандартная ситуация. Более того, создан он возможно и в далекой базовой форме - предке.
>Не терзают вас смутные сомнение что это не совсем правильно как >то?
Аргументы не совсем правильности в студию!
Danilka (2003-05-07 09:17:00) [12]NAlexey © (07.05.03 08:59)
а что, InplaceEditor каждый раз заново создается? ;))
NAlexey (2003-05-07 08:59:00) [13]Можно вопрос задать:
а вот это вот
with DBComboBox1 doполучается что у вас комбобокс уже созданный? и просто болтается гдето инвизибле? И в определенное время, когда открывается InplaceEditor, вы его в нужном месте бабах и показали? Не терзают вас смутные сомнение что это не совсем правильно как то?
Danilka (2003-05-07 08:38:00) [14]Инна (06.05.03 23:58)
ну, можно немножко проще, у каждого насленика TWinControl есть свойство BoundsRect, можно переписать так:
with DBComboBox1 do
begin
BoundsRect:=Rect;
Visible := True;
SetFocus;
end;
а на счет данные сначала отображать, для этого есть Database.StartTransaction / Commit, про это посмотри в хелпе у TDatabase
Инна (2003-05-06 23:58:00) [15]все вставилось :) такой вопрос возник: можно ли как-нить данные сначала только отображать, а не сразу отправлять на сервер? т.е. юзер выбрал в нескольких ячйках и только потом оправлять на сервер? или только через вставку записи сразу в таблицу?
если интересно, то код (правда, кривовато как-то отображается... не тютелька-в-тютельку):
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-06 13:13:00) [16]Sergey Masloff (06.05.03 12:44)
>ID писать в invisible столбец
ну, это я и имел ввиду, когда писал про варианты :))
Sergey Masloff (2003-05-06 12:44:00) [17]Danilka ©
Прокатит еще как. И в столбце будет отображаться что нужно - думаешь, я не пробовал ;-) ID писать в invisible столбец естественно. Кроме того, я не пользовался DBGridEh но не уверен что там реализована наличествующая у меня возможность изменять вываливаемый пользователю список не только в зависимости от "столбца" но и от "строки". Только не надо говорить что это никогда не нужно - нужно сплошь и рядом. Например, в гриде список людей. И выпадающие списки должны быть разными в зависимости от того взрослый это или ребенок ;-)
Danilka (2003-05-06 12:29:00) [18]Sergey Masloff (06.05.03 12:24)
прокатит, но как-то некрасиво, да и отображаться в столбце все равно будет id, хотя, есть варианты.
Danilka (2003-05-06 12:27:00) [19]Oops © (06.05.03 12:05)
>Dataset - из какаго датасета выбирать поля для подстановки
если я правильно понял, никакого датасета для подстановки нет, есть два списка один, с наименованиями, который надо отображать, воторй - с id, которые надо писать в базу.
честно говоря, для этого вижу два приемлемых пути:
1. писать свой грид, наследник от стандартного, в который добавить это возможность
2. использовать то, что написано другими, например DBGridEh - бесплатный для русскоговорящих. :)) в нем это реализовано ввиде двух свойств: KeyList и PickList
Sergey Masloff (2003-05-06 12:24:00) [20]Mike Kouzmine © (06.05.03 12:04)
>Ну так и сделай список объектов, а при onchange
>только не onchange.
так вот OnЧТО? ;-)
Oops ©
Все эти lookup потенциально ТАКИЕ тормоза что использовать их с оглядкой нужно. А есть случаи когда это вообще неприменимо.
Инна
Киньте на форму ComboBox, сделайте Visible:=False. В событии DrawColumnCell есть параметр типа TRect - прямоугольная область которую занимает ячейка. Соответственно в эту область перемещаете свой ComboBox и делаете Visible:=True. Ну и обработать пару событий. Писанины на 40 минут.