Редактирование грида | |
---|---|
Маша Автор Сообщений: 30 Дата регистрации: 06.10.2000 |
На форме есть грид ("readonly"=.t.) и кнопки: "редактировать", "сохранить" и "отменить". Можно ли сделать так, чтобы по кнопке редактировать, текущая строка грида становилась доступной для изменения, при этом нельзя было бы случайно перейти клавишами или мышью на другие строки и так до нажатия кнопок сохранить или отменить. Суть: не изменить нечаянно не то, что надо.
|
RE: Редактирование грида | |
---|---|
Sergey Titow Сообщений: 2242 Дата регистрации: 12.09.2000 |
По-моему, в этой ситуации самый логичный и надежный способ - редактировать в отдельном окне.
Если таки нужен грид, то можно при команде "редактировать" запомнить номер активной строки и затем в afterrowcolchange проверять на предемет ее изменения. Если изменилась - activatecell(...). |
Да нефиг делать | |
---|---|
MegaVolt Сообщений: 16 Дата регистрации: 05.10.2000 |
Очень даже просто.
Только нужно в таблицу для которой открыт грид ввести логическое поле (например FLG). Поле это по дефаулту принимает значение .F. а истинным становится в момент редактирования.Это прелюдия к опере. Теперь в ячейку грида (пусть там к примеру textbox и называется он 'text1')вставляем еще один textbox и называется он 'text2' Сам grid НЕ READONLY, а вот для примера .grid1.readoly=.f. .grid1.colomn1.readonly=.f. .grid1.colomn1.text1.readonly=.t. .grid1.colonm1.text2.readonly=.f. У колонки есть такое свойство DynamicCurrentControl Пишешь типа .grid1.column1.DynamicCurrentControl=iif(flg,'text2','text1') Все. Теперь в зависимости от значения поля FLG ячейка грида либо редактируема, либо нет. ПРЕДУПРЕЖДЕНИЕ: Свойство grid1.column1.CurrentControl должно быть ПУСТЫМ! Ежели там чего стоит - убрать! Вот собственно и все. (Если че поймешь в моей писанине - не поймешь, мыль) Конец оперы... |
RE: ... | |
---|---|
Vlad Сообщений: 850 Откуда: Запорожье Дата регистрации: 28.09.2000 |
Если , как я понял , ты хочешь , чтобы для конкретной строки в грид было возможно произвести редактирование , а для остальных нет ,то вот таких способностей у объекта GRID нет.
Это можно обойти. 1. При нажатии "редактировать"(или например двойному правому клику) поставить св-во курсора Cursor1.FILTER = Recno() и затем Thisform.Grid1.Refresh. 2. Использовать (как тут уже предлагалось) дополнительное логическое поле. Все значения которого равны .F. ,по нажатию "редактировать"(или например двойному правому клику) изменять его у выбранной строки на .T. , предварительно включить буферизацию таблицы. По окончанию редактирования (скажем название кнопки "редактировать" заменить на "закончить редактирование", или покороче и "погасить " другие органы управления- сделать их недоступными пока не закончена опреация редактирования) сделать UPDATE таблицы только для значения поля = .T.. 3. Использовать для редактирования поля редактирования Text . Связав их с гридом (в св-ве грида AfterColChange поставить text1.Refresh,text2.Refresh и т.д.) Соответственно когда будете перемещаться по гриду значения в полях будет меняться , тогда грид надо сделать Readonly=.T. , и интуитивно опратору будет понятно , что поменять можно только в этих полях. Если вам все таки нравится слово "редактировать" , можно сделать 2 вкладки (Page1,2) и одну из них обозвать "РЕДАКТИРОВАТЬ" а на ней уже расположить элементы для редактирование записи (я обычно так поступаю , если запись уж очень длинная , например платежное поручение) 4. Можно использовать хранимую процедуру , в которой как раз и определять надо счас редактировать эту запись или нет , по каким критериям определять - вопрос ..., по тому же полю (.T./.F.) - вообщем ваша фантазия |
RE: ... | |
---|---|
budding Сообщений: 32 Дата регистрации: 28.09.2000 |
Я в данном случае сделал так ( к этому все идет - не хотят юзеры редактировать в отдельной форме)
создам класс tcntRowOfGrid тип контейнер с Visible=.f.. Затем создаю от него класс СТРОКИ конкретного грида. размер должен быть как строка грида. Кидаю на него любые объекты скажем текстовое поле, кнопку, лабэл и тд Желательно чтобы было похоже на строку грида. И далее кидаю класс строки на форму ( у меня грид также в контейнере) после нажатия на кнопке редактировать грид делается enabled=.f. и все что тебе не надо. Top твоего класса строки делаешь равным так чтобы он совпадал со строкой грида. Класс твоей строки visible=.t. редактируешь значения в этом классе потом нажимаешь save и делаешь сохранения. Все что надо enabled=.t. класс строки visible=.f. Несколько долго делать поначалу сам класс tcntRowOfGrid методы сво-ва и тд. зато потом используешь и тратишь время только на то чтобы заполнить класс строки объектами. Procedure Grid1.AfterRowColChange This.nActiveRow = This.RelativeRow endproc Procedure mEditInGrid Thisform.tcntEditInGrid1.Top=Thisform.Grid1.Top + Thisform.Grid1.ВысотаHeader + (Thisform.Grid1.nActiveRow -1) * Thisform.Grdi1.ВысотаRow Thisform.tcntEditInGrid1.Visible=.t. endproc В классе строки можно втавлять кнопки вызова справочника, если в гриде текстовое поле то здесь можно поставить комбо бох.То есть я считаю что время которое потратишь на то чтобы в грид вставить объекты дополнительные, указать сво-во ДинамикАктивКонтрол и тд то быстрее создать класс производный от tcntRowOfGrid который создаешь только один раз. слишком много стал болтать в последнее время =) будет непонятно пиши. Я сам принимаюсь за этот класс юзеры заставляют. Правда я подсвои классы его буду оттачивать. |
редактирование грида | |
---|---|
Игорь Ильин |
Вариант:
1. По нажатию кнопки "редактирование" grid1.readonly=.f. nCurrentRecord=recno() EditMode=.t. а в grid1.AfterRowColChange if EditMode=.t. goto nCurrentRecord endif идея понята? А ведь есть еще BeforeRowColChange, Valid... С ними можно тоже всякого напридумывать ;) |
© 2000-2024 Fox Club  |