Добрый день!
Почему-то не не обновляется объект IDataGrid.
Смотрю ActiveView.Items(1).DataField.DisplayValue там одно значение, а реально на экране совсем другое. Особенность грида в том что в DatasetLink указан редактируемый MemoryDataset, в котором так же установлено нормальное значение.
Обновляться прекращает после того как в форме нажимаешь ОК (не важно редактировался ли MemoryDataset). После чего всегда визуально отображается содержимое формы по которой был клик ОК, не смотря на то что открывается совсем другое содержимое...

Нравится

16 комментариев

Ммм, обращаться к активной (текущей выделенной) строке нужно так:

DataGrid.DatasetLink.Dataset.DataFields('ID').Value;

И заметьте, т.к. это редактируемый грид, значение в DataField'е обновится только при выходе из режима редактирования ячейки (либо после нажатия на Enter)

"Олейник Дмитрий" написал:Ммм, обращаться к активной (текущей выделенной) строке нужно так:

DataGrid.DatasetLink.Dataset.DataFields('ID').Value;

Дмитрий, добрый день! Возможно я "ммм" не очень понятно пишу, но еще раз подчеркну

"AlexLS" написал:в DatasetLink указан редактируемый MemoryDataset, в котором так же установлено нормальное значение

"Олейник Дмитрий" написал:при выходе из режима редактирования ячейки

никакого редактирования не происходило, только открытие формы в которой в датасете и в гриде дебаггер показывает правильные значения а "глаза" видят значения из той формы в которой последний раз был апдейт/инсерт!

Алекс, добрый день.

Все еще не понял про "нормальные значения".

Ни разу не сталкивался с таким поведением. Грид не кеширует значения датасета. Мне кажется чтото не так с датасетом, привязанным к гриду, вернее скорее всего датасет, в котором корректные значения не привязан к гриду. Можете написать кейс воспроизведения, при котором грид визуально отображает данные старой (насколько я понял) формы?
Я также, желательно, приведите код заполнения memoryDataset'a.

В GridAreaOnPrepare пишу:

if (Assigned(ParentDataset = GetAttribute(Window, 'ParentDataset'))	) 
  if (!IsEmptyValue(IsInserting = ParentDataset.State == dstInsert)) {
    var ds = Services.GetNewItemByUSI(IsInserting ? 
                'ds_RequestStockTypeMec' : 'ds_TypeMecDetail');
      if(!IsInserting) 
        ApplyDatasetFilter(ds, 'RequestStock2ID', ParentDataset('ID'),true);
      ds.Close();
      ds.Open();
      mdsTypeMecDetail.Dataset.Close();
      CopyMemoryDataset(ds, mdsTypeMecDetail.Dataset);
      if (Assigned(grdData))
      if(grdData.DatasetLink.Name != 'mdsTypeMecDetail')
      grdData.DatasetLink = mdsTypeMecDetail;
      ds.Close();
 
  }

где ds_TypeMecDetail - штатный датасет для данной детали,
ds_RequestStockTypeMec - датасет справочника, из которого подгружаются данные при Append
mdsTypeMecDetail - собственно меморидатасет, который и нужно заполнять в карточке
ParentDataset - датасет карточки редактирования записи, в которой и находится windowcontainer с гридом.

Проблема скорее всего тут:

grdData.DatasetLink = mdsTypeMecDetail;

Лучше всего сначала очистить, а затем заполнить свойство DatasetLink:

grdData.DatasetLink = System.EmptyValue;
grdData.DatasetLink = mdsTypeMecDetail;

А затем нужно открыть mds:

grdData.DatasetLink = System.EmptyValue;
grdData.DatasetLink = mdsTypeMecDetail;
grdData.DatasetLink.Dataset.Open();

И определить событие для DatasetLink(mdsTypeMecDetail): OnDatasetAfterOpen(Dataset), и уже внутри него заполнять mds. Тогда все будет корректно.

function dlDataOnDatasetAfterOpen(Dataset) {
Dataset.Append();
....
Dataset.Post();
}

Также не понял, почему используется GridAreaOnPrepare... Но тут нужно знать вашу бизнес задачу.

"Олейник Дмитрий" написал:Также не понял, почему используется GridAreaOnPrepare... Но тут нужно знать вашу бизнес задачу.

Исходно нужно реализовать "множественный выбор" (то есть все значения из справочника с галочками... очень похоже на деталь Доступ :smile: только в карточке редактирования).
Уже работающую деталь потребовалось положить в эдитвиндоу. Пытался "малой кровью" эту деталь использовать с подменой обычного датасета на меморидатасет.

Ага, я когда-то чтото подобное делал с напоминаниями: открывается каточка детали "напоминания" какого либо раздела, там есть лукапное поле контакт, жмем на лупу и открывается multi_select_window - можно выбрать несоклько контактов, а затем при закрытии краточки - на деталь добавлялось столько записей, сколько выбрано было контактов.
Посмотрите, может быть поможет:

http://www.community.terrasoft.ru/blogs/8462

Здорово получается, до инсерта/апдейта

grdData.DatasetLink.Dataset.Open();

вызывает memoryDatasetOnDatasetAfterOpen
а после апдейта .Open() уже игнорирует AfterOpen!

[quote="Олейник Дмитрий"]Ага, я когда-то чтото подобное делал с напоминаниями: открывается каточка детали "напоминания" какого либо раздела, там есть лукапное поле контакт, жмем на лупу и открывается multi_select_window - можно выбрать несоклько контактов, а затем при закрытии краточки - на деталь добавлялось столько записей, сколько выбрано было контактов.
Посмотрите, может быть поможет:

http://www.community.terrasoft.ru/blogs/8462[/quote]
Спасибо, Дмитрий! Попробую поразбираться.

Предполагаю что косяк кроется в меморидатасете, который живет какой-то своей жизнью и не подчиняется общим правилам...

Alex, а что значит Update?

Немного про мемориDS: это штука живет от Open() до Close(); Заполняется на OnDatasetAfterOpen(); После открытия датасета, можно позиционироваться на любой строке,и изменять любую ячейку:
Dataset.Edit();
Dataset.Post();
Все изменения грид перерисует самостоятельно.
Помните, что каждый рефреш, (Dataset.Close(), Dataset.Open()) вызывает перезаполнение датасета. Т.е. если вы не сохранили измененные данные куда то в таблицу БД, с которой заполняете датасет, то он заполнится старыми значениями.

"Олейник Дмитрий" написал:

Alex, а что значит Update?

Немного про мемориDS: это штука живет от Open() до Close(); Заполняется на OnDatasetAfterOpen(); После открытия датасета, можно позиционироваться на любой строке,и изменять любую ячейку:

Dataset.Edit();

Dataset.Post();

Все изменения грид перерисует самостоятельно.

Помните, что каждый рефреш, (Dataset.Close(), Dataset.Open()) вызывает перезаполнение датасета. Т.е. если вы не сохранили измененные данные куда то в таблицу БД, с которой заполняете датасет, то он заполнится старыми значениями.

С уважением,

Олейник Дмитрий


В какой-то момент меморидатасет перестает реагировать на Dataset.Close() и Dataset.Open().
Пишу

grdData.DatasetLink = System.EmptyValue;
grdData.DatasetLink = mdsRStock2AccDivision;
grdData.DatasetLink.Dataset.Close();
SetAttribute(grdData.DatasetLink.Dataset, 'ParentWindow', Window);
if (Assigned(ParentDataset = GetAttribute(Window, 'ParentDataset'))	)		SetAttribute(grdData.DatasetLink.Dataset, 'ParentDataset', ParentDataset);
grdData.DatasetLink.Dataset.Open();

но ни
function mds_RStock2AccDivisionOnDatasetAfterOpen
ни
function mds_RStock2AccDivisionOnDatasetAfterClose

не срабатывают!

наконец нашел свой косяк:
в посте (записи из мемдатасета в реальный датасет) для мемдатасета делал DisableEvents(), а EnableEvents() забыл сделать.... теперь все обновляется!

Только почему-то если

Dataset.EnableEvents();
Dataset.Close();

то возникает ошибка:

TSObjectLibrary.MemoryDataset: Cannot focus a disabled or invisible window

а

Dataset.Close();
Dataset.EnableEvents();

ошибку не вызывает

Проверьте состояние датасета в момент Open() - быть может он уже в состоянии Open(), тогда функция не вызывается и события AfterOpen() не тригернутся.

Alex, да, бывает :)

"Олейник Дмитрий" написал:

Alex, да, бывает :)

С уважением,

Олейник Дмитрий


Дмитрий, спасибо Вам за помощь!

Показать все комментарии

Здравствуйте!

Я хотел бы узнать, возможно ли отключить в IDataGrid только меню навигации перехода на страницы?

Заранее спасибо!

Нравится

1 комментарий

Нет, из конфигурации не получится (это ядро).

Показать все комментарии