Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   grid.Panel - setEditor - работает не корректно (https://javascript.ru/forum/extjs/20815-grid-panel-seteditor-rabotaet-ne-korrektno.html)

Black_Prince 18.08.2011 15:41

grid.Panel - setEditor - работает не корректно
 
Задача такая - есть грид с двумя колонками. Первая колонка - ключ, вторая - значение. Значение может быть как текстовым, так и булевым или выбираться из списка.

сделал небольшой примерчик, который моделирует такую ситуацию:
grid = Ext.create('Ext.grid.Panel', {
.........
columns: [
......
//изначально создаем редактируемое текстовое поле
{header: 'Director', dataIndex: 'director', field:{allowBlank: false, width:'10px'}},
//комбобокс, по событию выбора будем менять editor
{header: 'Genre', dataIndex: 'genre', sortable: true,
                field:{
                    xtype: 'combobox',
                    selectOnTab: true,
                    listClass: 'x-combo-list-small',
                    store:[
                        ['1', '1'],
                        ['2', '2'],
                        ['3', '3'],
                        ['4', '4'],
                    ],
                    listeners: {
                        select: function(combo, record, index)
                        {
                             var cm = grid.getView().getGridColumns();
                             var valCol = cm[0];

//если значение равняется 3 - изменяем editor на combobox
                             if(combo.value == '3')
                             {
                                 valCol.setEditor({
                                   xtype: 'combobox',
                                   allowBlank: false,
                                    selectOnTab: true,
                                    listClass: 'x-combo-list-small',
                                    store:[
                                        ['1', '1'],
                                        ['2', '2'],
                                        ['3', '3'],
                                        ['4', '4'],
                                    ]
                                });
                             }
//если значение равняется 2 - editor на textfield  
                             if(combo.value == '2')
                             {
                                 valCol.setEditor({
                                   xtype: 'textfield'
                                 })
                             }
//если значение равняется 4 - editor на numberfield 
                             if(combo.value == '4')
                             {
                                 valCol.setEditor({
                                   xtype: 'numberfield'
                                 })
                             }
                        }
                    }
            }}


Самое интересное в том, что если мы сначала выберем значение из комбо (например "3" для наглядности) - editor заменится, но вот после того как мы кликнем на первой колонке и попадем в editor - он заменяться перестает.

Т.е. если сначала выбрать 3 -> кликнуть на первом поле -> появится combobox -> выбрать 2 -> кликнуть на первом поле -> останется тот же комбо, которое почему то не заменилось на текстовое поле.

Пробовал вызвать принудительно реконфигурацию для грида - не помогло.

ilshat 19.08.2011 07:44

да... тоже заметил что setEditor у них не работает...

http://joekuan.wordpress.com/2011/03...r/#comment-711

для rowEditor вроде как найдено решение, но ковыряться не стал...

если у тебя всего две колонки - то почему проперти грид не используешь

Black_Prince 19.08.2011 11:06

Да, пытался делать пример как раз по этой ссылке... правда там есть непонятка в
61 editor.insert(3, new_editor);
62 editor.verifyLayout(true);

editor - это у него панель? или текущая строка? или текущая колонка?

Как раз с этим примером setEditor изменяет editor только, если не было клика на него, повторно эта функция не отрабатывает.

А на счет проперти грид - спасибо, как то просмотрел такое в примерах, буду сейчас юзать.

З.Ы. в любом случае в ExtJS 4 - ошибок тьма.

ilshat 19.08.2011 12:43

editor.insert(3, new_editor);

editor в данном случае это rowEditor - грубо говоря панель с несколькими Ext.Editor... для каждого столбца...
а new_editor это просто нужный экзмепляр Ext.Editor- который вставляется в строку для указанного столбца

да... в каждой версии куча недоработок... от каких то избавляются... но обязательно добавляют новые...
сегодня наткнулся - что объединение заголовок грида некорректно работает с блокировкой колонки....

inconnect 01.11.2011 09:50

Получилось ли сделать это? Помогите, у меня такая же трабла! Экспериментировал на тройке, все заработало.
А в 4.0.2 не понимает verifyLayout и SetEditor

Black_Prince 01.11.2011 11:22

Я так понял что при первом вызове едитора но уже "прикрепляется" к строке и дальнейшие изменения не вызывают рендеринг самого грида.

Получилось с помощью проперти грида. Пришлось переделывать свой код.
Там конечно есть свои баги :) .

Например у пропертигрида не изменяется ширина колонок, но ответ на этот баг в другой теме этого форума.


Часовой пояс GMT +3, время: 04:08.