我在java脚本中有一个国家/地区和州的下拉列表。它的作用是从列表中选择一个国家/地区,并在状态字段中填入状态下拉列表。当我这样做时,我保存表格的详细信息。但是当我重新打开表单时,“国家/地区”下拉列表会变为空白。
JS,在CRM表单中的OnLoad事件中调用。我已经在crm-online 2015中实现了这一点。 这是下面的Java脚本代码。
有人能指出我正确的方向吗? 非常感谢,
function LoadCountryField(countryFieldName, stateFieldName) {
var $countryField = $('#' + countryFieldName);
if ($countryField.length < 1) return;
$countryField.hide();
var selectedCountry = $countryField.val();
var countryRequirementLevel = Xrm.Page.getAttribute(countryFieldName).getRequiredLevel();
countryRequirementLevel = countryRequirementLevel == "required" ? 2 : countryRequirementLevel == "recommended" ? 1 : 0;
var $countryDropdown = generateSelectBox('ddl_' + countryFieldName, countryRequirementLevel, Countries, selectedCountry);
$('#' + countryFieldName + '_d').append($countryDropdown);
$countryDropdown.change({ 'countryFieldName': countryFieldName, 'stateFieldName': stateFieldName }, handleCountryChanged);
document.getElementById('ddl_' + countryFieldName).tabIndex = document.getElementById(countryFieldName).tabIndex;
LoadStateField(stateFieldName, selectedCountry);
}
// Configures the stateOrProvince field to be a dropdown dependent on the value of the country dropdown. Values are pulled from the Countries object.
function LoadStateField(stateFieldName, selectedCountry) {
var stateAttr = Xrm.Page.getAttribute(stateFieldName);
var selectedState = stateAttr == null ? "" : stateAttr.getValue();
var states = getStatesForCountry(selectedCountry);
var $stateField = $('#' + stateFieldName);
if (states == null || !$.isArray(states) || states.length < 1) {
$('#ddl_' + stateFieldName).remove();
$stateField.show();
return;
}
$stateField.hide();
var stateRequirementLevel = Xrm.Page.getAttribute(stateFieldName).getRequiredLevel();
stateRequirementLevel = stateRequirementLevel == "required" ? 2 : stateRequirementLevel == "recommended" ? 1 : 0;
var $stateDropdown = generateSelectBox('ddl_' + stateFieldName, stateRequirementLevel, states, selectedState);
var $existingDropdown = $('#ddl_' + stateFieldName);
if ($existingDropdown.length < 1)
$('#' + stateFieldName + '_d').append($stateDropdown);
else
$existingDropdown.replaceWith($stateDropdown);
$stateDropdown.change({ 'stateFieldName': stateFieldName }, handleStateChanged);
$stateDropdown.change();
document.getElementById('ddl_' + stateFieldName).tabIndex = document.getElementById(stateFieldName).tabIndex;
}
// Finds the states that go with selectedCountry, using the Countries object.
function getStatesForCountry(selectedCountry) {
for (i in Countries) {
var country = Countries[i];
if (selectedCountry == country.name)
return country.states;
}
return [];
}
// Sets the value of the country field to the newly selected value and reconfigures the dependent state dropdown.
function handleCountryChanged(eventData) {
var stateFieldName = eventData.data.stateFieldName;
var selectedCountry = setFieldFromDropdown(eventData.data.countryFieldName);
LoadStateField(stateFieldName, selectedCountry);
}
// Sets the value of the stateOrProvince field to the newly selected value
function handleStateChanged(eventData) {
setFieldFromDropdown(eventData.data.stateFieldName);
}
// Sets a field's value based on a related dropdown's value
function setFieldFromDropdown(fieldName) {
var $dropdown = $('#ddl_' + fieldName);
if ($dropdown.length != 1) return null;
var selectedValue = $dropdown.find('option:selected:first').val();
var attr = Xrm.Page.getAttribute(fieldName);
if (attr != null) attr.setValue(selectedValue);
return selectedValue;
}
// Generates a new select box with appropriate attributes for MS CRM 2011.
function generateSelectBox(id, requirementLevel, options, selectedValue) {
var $ddl = $('<select id="' + id + '" class="ms-crm-SelectBox" req="' + requirementLevel + '" height="4" style="IME-MODE: auto; width: 100%"></select>');
$ddl.append(jQuery('<option></option').val('').html(''));
$.each(options, function (i, item) {
$ddl.append(jQuery('<option></option').val(item.name).html(item.name));
if (selectedValue == item.name)
$ddl.find('option:last').attr('selected', 'selected');
});
return $ddl;
}
****无论如何我得到了它的工作**** 感谢大家的建议和帮助
答案 0 :(得分:3)
您的代码不受支持,如果您的选项集包含您可以使用相关选项集的所有值MSDN示例
答案 1 :(得分:0)
目前还不完全清楚你在做什么,但看起来你正在使用不受支持的JavaScript,你真的不应该这样做。
这些类型的调用getElementById
,这个位置似乎是generateSelectBox
添加自定义控件,以及所有jQuery。
Supported extensions for Microsoft Dynamics CRM
与Microsoft Dynamics CRM应用程序页面的所有交互都必须 只能通过Xrm.Page或Xrm.Utility的方法执行 客户端编程参考中记录的名称空间。 直接访问任何Microsoft的文档对象模型(DOM) 不支持Dynamics CRM应用程序页面。在jQuery中的使用 不建议使用表单脚本和命令。更多信息:使用 jQuery的
所以我希望用支持的东西替换尽可能多的不受支持的东西。
就表单上的空白字段重新加载而言,可能是因为该字段未保存到数据库中。 CRM需要知道该字段是dirty
来提交更改。如果该字段是只读的,有时这可能会导致问题,因为CRM不希望该字段获得dirty
。我建议在实体上启用审计,以验证CRM是否实际将字段保存到数据库中。