如何获取Dynamics自动完成字段的选中值?
解决Dynamics 365自定义自动完成字段选中值获取异常问题
问题现象
自定义上下文敏感自动完成字段,通过按键触发从服务获取匹配街道数据并展示下拉选项:
- 用户输入“Main”后,下拉框显示所有以“Main”开头的街道(如“Mainstreet”)
- 点击“Mainstreet”后,字段显示文本正确,但调用
formContext.getControl("address1_line1").getValue()始终返回旧搜索值“Main”,包括OnChange事件中获取的值也异常
问题原因
使用showAutoComplete仅渲染了下拉选项,但未处理选中选项后的字段值同步逻辑。Dynamics 365的文本框控件不会自动将自定义自动完成的选中值写入字段的底层值,仅更新了显示文本,导致getValue()读取的仍是用户输入的原始内容。
解决方案
- 为自动完成控件绑定
autocompleteSelect事件,监听用户选中选项的动作 - 在选中事件中,手动调用控件的
setValue()方法,将选中的选项值写入字段的底层值 - 修正原代码中对XML返回值的过滤逻辑错误(原代码直接对XML对象执行
filter会失效)
修正后的完整代码
按键触发函数(获取并展示自动完成选项)
function _addOnKeyPressStreet(executionContext) { var formContext = executionContext.getFormContext(); var input = formContext.getControl("address1_line1").getValue(); var streetControl = executionContext.getEventSource(); var resultSet = { results: [] }; if (input != null && input.length > 3) { try { var streets = getLokalisation("POST", "xxxxxxxxxxxxxx", input); var suggestions = []; // 解析XML返回值提取街道名称 $(streets).find('localisationen localisation text').each(function() { suggestions.push(this.innerHTML.toString()); }); // 过滤匹配输入前缀的结果 var filteredResults = suggestions.filter(n => n.toLowerCase().startsWith(input.toLowerCase())); if (filteredResults.length > 0) { filteredResults.forEach((street, index) => { resultSet.results.push({ id: index, fields: [street] }); }); streetControl.showAutoComplete(resultSet); // 绑定自动完成选中事件 streetControl.addOnAutoCompleteSelect(_onAutoCompleteStreetSelect); } else { streetControl.hideAutoComplete(); } } catch (exp) { alert(exp); } } else { streetControl.hideAutoComplete(); } }
自动完成选中事件处理函数(同步字段值)
function _onAutoCompleteStreetSelect(executionContext) { var formContext = executionContext.getFormContext(); var selectedItem = executionContext.getEventArgs().getSelectedItem(); var streetControl = formContext.getControl("address1_line1"); // 将选中的街道名称写入字段底层值 streetControl.setValue(selectedItem.fields[0]); }
修正后的OnChange事件函数
function _addOnChangeStreet(executionContext) { var formContext = executionContext.getFormContext(); // 现在可正确获取选中的街道值 alert(formContext.getControl("address1_line1").getValue()); }
关键说明
addOnAutoCompleteSelect是Dynamics 365控件的原生方法,用于监听自动完成选项的选中动作getSelectedItem()可获取选中的选项对象,其中fields数组存储了之前在resultSet中定义的显示文本- 手动调用
setValue()会同时更新字段的显示文本和底层值,确保getValue()能返回正确结果
内容的提问来源于stack exchange,提问作者Paul Richardson
相关产品推荐
相关产品推荐

