jquery DevExtreme数据网格弹出菜单是否具有级联下拉/查找?

y1aodyip  于 2022-11-03  发布在  jQuery
关注(0)|答案(1)|浏览(99)

我希望找到一个解决方案,在弹出窗体上级联查找,因为第二个查找需要在运行时设置其dataSource(或调用API),因为查找源可能来自不同的源。例如,假设我选择了阿肯色州,则它将设置与Web服务调用不同的查找,并且如果选择了加州,则它将使用来自数据库的调用来填充查找值。
我以下面的DevExtreme示例为例,需要哪些事件或方法来实现这一点?
代码示例:

$(() => {
      $('#gridContainer').dxDataGrid({
        keyExpr: 'ID',
        dataSource: employees,
        showBorders: true,
        editing: {
          allowUpdating: true,
          allowAdding: true,
          mode: 'popup',
        },
        onEditorPreparing(e) {
          if (e.parentType === 'dataRow' && e.dataField === 'CityID') {
            e.editorOptions.disabled = (typeof e.row.data.StateID !== 'number');
          }
        },
        columns: ['FirstName', 'LastName', 'Position',
          {
            dataField: 'StateID',
            caption: 'State',
            setCellValue(rowData, value) {
              rowData.StateID = value;
              rowData.CityID = null;
            },
            lookup: {
              dataSource: states,
              valueExpr: 'ID',
              displayExpr: 'Name',
            },
          },
          {
            dataField: 'CityID',
            caption: 'City',
            lookup: {
//this is not a static list and will need to be populated when the State changes from various sources...
              dataSource(options) {
                return {
                  store: cities,
                  filter: options.data ? ['StateID', '=', options.data.StateID] : null,
                };
              },
              valueExpr: 'ID',
              displayExpr: 'Name',
            },
          },
        ],
      });
    });

数据来源:

const states = [{
  ID: 1,
  Name: 'Alabama',
}, {
  ID: 2,
  Name: 'Alaska',
}, {
  ID: 3,
  Name: 'Arizona',
}, {
  ID: 4,
  Name: 'Arkansas',
}, {
  ID: 5,
  Name: 'California',
}];

const cities = [{
  ID: 1,
  Name: 'Tuscaloosa',
  StateID: 1,
}, {
  ID: 2,
  Name: 'Hoover',
  StateID: 1,
}, {
  ID: 3,
  Name: 'Dothan',
  StateID: 1,
}, {
  ID: 4,
  Name: 'Decatur',
  StateID: 1,
}, {
  ID: 5,
  Name: 'Anchorage',
  StateID: 2,
}, {
  ID: 6,
  Name: 'Fairbanks',
  StateID: 2,
}, {
  ID: 7,
  Name: 'Juneau',
  StateID: 2,
}, {
  ID: 8,
  Name: 'Avondale',
  StateID: 3,
}, {
  ID: 9,
  Name: 'Buckeye',
  StateID: 3,
}];
lzfw57am

lzfw57am1#

我设法使用onEditorPreparing方法解决了这个问题,基本上,您必须注册onValueChanged事件来操作您需要的列单元格:

onEditorPreparing: (e): any => {
   if (e.parentType === 'dataRow') {
      if (e.dataField === 'FieldType') {
         e.editorName = 'dxLookup';
         $.extend(e.editorOptions, {
             showClearButton: true,
             dataSource: this.SetDatasource(this.GetArrayDataStore(AdvancedSettingsBuilder.GetFieldTypes)),
             valueExpr: 'value',
             displayExpr: 'text',
             value: e.value || [],
             onValueChanged: async (args): Promise<void> => {
                 e.setValue(args.value);
                 .........

相关问题