当重新打开表单时,下拉列表变为空白

时间:2015-07-03 10:47:06

标签: javascript forms crm dynamics-crm-online

我在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;
}

****无论如何我得到了它的工作**** 感谢大家的建议和帮助

2 个答案:

答案 0 :(得分:3)

您的代码不受支持,如果您的选项集包含您可以使用相关选项集的所有值MSDN示例

https://msdn.microsoft.com/en-us/library/gg594433.aspx

答案 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是否实际将字段保存到数据库中。