:: Архив конференции по VFP до 2005 года
Редактирование грида
Маша
Автор

Сообщений: 30
Дата регистрации: 06.10.2000
На форме есть грид ("readonly"=.t.) и кнопки: "редактировать", "сохранить" и "отменить". Можно ли сделать так, чтобы по кнопке редактировать, текущая строка грида становилась доступной для изменения, при этом нельзя было бы случайно перейти клавишами или мышью на другие строки и так до нажатия кнопок сохранить или отменить. Суть: не изменить нечаянно не то, что надо.
Ratings: 0 negative/0 positive
RE: Редактирование грида
Sergey Titow

Сообщений: 2242
Дата регистрации: 12.09.2000
По-моему, в этой ситуации самый логичный и надежный способ - редактировать в отдельном окне.
Если таки нужен грид, то можно при команде "редактировать" запомнить номер активной строки и затем в afterrowcolchange проверять на предемет ее изменения. Если изменилась - activatecell(...).
Ratings: 0 negative/0 positive
Да нефиг делать
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 должно быть ПУСТЫМ! Ежели там чего стоит - убрать!
Вот собственно и все. (Если че поймешь в моей писанине - не поймешь, мыль)
Конец оперы...


Ratings: 0 negative/0 positive
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.) - вообщем ваша фантазия
Ratings: 0 negative/0 positive
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 который создаешь только один раз.

слишком много стал болтать в последнее время =)
будет непонятно пиши. Я сам принимаюсь за этот класс юзеры заставляют.
Правда я подсвои классы его буду оттачивать.
Ratings: 0 negative/0 positive
редактирование грида
Игорь Ильин
Вариант:
1. По нажатию кнопки "редактирование"
grid1.readonly=.f.
nCurrentRecord=recno()
EditMode=.t.

а в grid1.AfterRowColChange

if EditMode=.t.
goto nCurrentRecord
endif

идея понята?
А ведь есть еще BeforeRowColChange, Valid...
С ними можно тоже всякого напридумывать ;)
Ratings: 0 negative/0 positive


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

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

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