AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.02.2011, 13:55   #1  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Дублирование адресов на форме поставщиков Ax2009
Возникла необходимость продублировать грид с адресами, теперь при попытке вставить запись в новый грид. фокус перескакивает на оригинальный. (гриды на разных закладках, источник(и) данных один(и))

Можно ли вообще так делать?
И где что можно перекрыть, чтобы не прыгать по закладкам? Никак не соображу

Последний раз редактировалось uchenik; 04.02.2011 в 14:05.
Старый 04.02.2011, 14:58   #2  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
А как делали? Сдублировали оригинальный TabPage с адресом?
Если так, то смотрите в новом TabPage метод tabPageAcivated, скорее всего тоже перенесли. Там строчка
X++:
  addressGrid.setFocus();
И делает активным исходный грид
Старый 04.02.2011, 15:03   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от uchenik Посмотреть сообщение
гриды на разных закладках, источник(и) данных один(и)
Само по себе это не должно вызывать такого поведения. Скорее всего фокус ввода смещает код находящийся в методах источника данных. Что бы точно выяснить источник проблемы можно поставить breakpoint в методе pageActivated вкладки и по стеку вызовов вычислить виновника.

Цитата:
Сообщение от jonny Посмотреть сообщение
А как делали? Сдублировали оригинальный TabPage с адресом?
Если так, то смотрите в новом TabPage метод tabPageAcivated, скорее всего тоже перенесли. Там строчка
X++:
  addressGrid.setFocus();
И делает активным исходный грид
если так, то по логике на новую вкладку вообще не попасть

Последний раз редактировалось S.Kuskov; 04.02.2011 в 15:05.
Старый 04.02.2011, 15:03   #4  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Сделайте второй такой же датасорс с LinkType : Passive, и привяжите к нему второй tabpage, прыгать не будет - это, как вариант.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 04.02.2011, 15:08   #5  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Цитата:
Сообщение от jonny Посмотреть сообщение
А как делали? Сдублировали оригинальный TabPage с адресом?
Если так, то смотрите в новом TabPage метод tabPageAcivated, скорее всего тоже перенесли. Там строчка
X++:
  addressGrid.setFocus();
И делает активным исходный грид
Не, это все естественно поправил.
Старый 04.02.2011, 15:09   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Само по себе это не должно вызывать такого поведения.
Похоже я не прав. Сейчас сделал тестовую формочку. Действительно прыгает при вставке новой строки!
Старый 04.02.2011, 15:09   #7  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
еще вариант - наверной самый лучший - в свойствах второго TabPage ставите Avtodeclaration - Yes; и в методе Create датасоурса пишите :


X++:
public void create(boolean _append = false)
{
    boolean active = false;

    if (TabPage2.isActivePage())
        active = true;

    super(_append);

    if (active)
       TabPage2.activatePage();
}
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 04.02.2011, 15:18   #8  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Цитата:
Сообщение от Pustik Посмотреть сообщение
еще вариант - наверной самый лучший - в свойствах второго TabPage ставите Avtodeclaration - Yes; и в методе Create датасоурса пишите :


X++:
public void create(boolean _append = false)
{
    boolean active = false;
 
    if (TabPage2.isActivePage())
        active = true;
 
    super(_append);
 
    if (active)
       TabPage2.activatePage();
}
Что-то похожее тоже сочинял, дело в том, что аксапта все равно успевает открыть оригинал, а там еще и executeQuery дернуться успевает
Старый 04.02.2011, 15:29   #9  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
в ClassDeclaration формы описываете переменную
X++:
boolean active;
в методе init формы до super() пишите
X++:
active = true;
в методе executequery() datasourse пишите
X++:
if (active == false)
        return;
в методе create() датасорса пишите
X++:
public void create(boolean _append = false)
{

    active = false;

    if (TabPage2.isActivePage())
        active = true;

    super(_append);

    if (active)
       TabPage2.activatePage();

    active = true;
}
в методе PageActivated() первого TabePage пишите
X++:
public void pageActivated()
{
    if (active == true)
        return;
    super();
}
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 04.02.2011 в 15:33.
Старый 04.02.2011, 15:34   #10  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Чем обусловлено использование одного и того же набора датасорсов для разных гридов? если ничем кроме лени - то сделайте отдельные датасорсы, быстрее отмучаетесь
Старый 04.02.2011, 15:44   #11  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Цитата:
Сообщение от Pustik Посмотреть сообщение
в ClassDeclaration формы описываете переменную
...
Вот в форме поставщиков не работает.

Цитата:
Сообщение от Zabr Посмотреть сообщение
Чем обусловлено использование одного и того же набора датасорсов для разных гридов? если ничем кроме лени - то сделайте отдельные датасорсы, быстрее отмучаетесь
Какой-то подход не очень, куча лишних источников данных, нужно помнить, что их править только вместе.
Старый 04.02.2011, 16:09   #12  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
а куда у вас прыгает на закладку обзор или на закладку первого адреса?
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 04.02.2011, 16:19   #13  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
declaration
X++:
boolean _create
init
X++:
_create = false
create
X++:
if (Tab.isActivePage())
 _create = true;
 
super(...
TabChange
X++:
...
if (_create)
return false;
...
Но change дергается дважды, и где-то надо сбросить _create.
Старый 04.02.2011, 16:19   #14  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Цитата:
Сообщение от Pustik Посмотреть сообщение
а куда у вас прыгает на закладку обзор или на закладку первого адреса?
На закладку первого грида.
Старый 04.02.2011, 16:21   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Проследил источник вызова pageActivated. Легче не стало
Цитата:
[c] \Classes\FormTabPageControl\pageActivated 4
[c] \Classes\FormTabControl\TabChanged
[c] \Classes\FormStringControl\enter
[c] \Classes\FormRun\selectControl
[c] \Classes\FormDataSource\create
[c] \Classes\FormDataSource\Next
[c] \Classes\FormRun\task
[c] \Classes\SysSetupFormRun\task
Так же заметил один странный момент. Если в методе create поставить breakpoint, то переключение вкладки не происходит!
X++:
public void create(boolean _append = false)
{
    breakpoint;
    super(_append);
}
Прям квантовая физика какая-то. Наблюдение за экспериментом меняет результаты эксперимента

P.S.: Эксперименты проводил на простейшей тестовой формочке, так что влияние других факторов минимально.
Старый 04.02.2011, 16:33   #16  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
сделайте вторую переменную для отслеживания второго дергания change. например счетчик i = 1; ну что-то типа
TabChange
X++:
if (_create && i < 2)
    {
        i++
        return false;
    }
а в конце Create обнуляйте
X++:
super();
i=0
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 04.02.2011, 16:37   #17  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Ну это совсем костыль какой-то, а если оно три раза будет вызываться?
Если пытаться корректировать в pageActivated, там может раз 30 дернуться, в зависимости от версии
Старый 04.02.2011, 17:20   #18  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
X++:
public boolean tabChange(int _FromTab)
{
    boolean ret;
    ;
    if (_create)
    {
        CopyOfAddressGrid.setFocus();
        _create = false;
        return false;
    }
    ret = super(_FromTab);
    return ret;
}
более-менее, на вид ошибка лишь в том, что если в новом гриде создали строку, то при переходе на дубль грида вызывается обновление источника данных.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно связать таблицы в форме? Как показать параметры партии? mazzy DAX: Программирование 10 27.10.2010 15:56
Несинхронность размерности полей в форме поиска... glibs DAX: Функционал 0 05.04.2010 21:54
Shekhar: Dynamics AX2009 : Standalone Installation on Vista with Role centres and workflow. Blog bot DAX Blogs 0 30.03.2010 15:05
На форме один lookup для Клиентов и Поставщиков tolstjak DAX: Программирование 10 17.03.2010 16:20
ax2009 & SSRS kitty DAX: Программирование 6 02.04.2009 10:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:39.