Javascript 当窗体重新打开时,下拉列表变为空白

Javascript 当窗体重新打开时,下拉列表变为空白,javascript,forms,crm,dynamics-crm-online,Javascript,Forms,Crm,Dynamics Crm Online,我在java脚本中有一个国家和州的下拉列表,它所做的是从列表中选择一个国家,然后在“州”字段中填充一个州的下拉列表。完成此操作后,我会保存带有详细信息的表单。但是当我重新打开表单时,国家下拉列表变为空白 JS在CRM表单中的OnLoad事件中调用。我已经在crm online 2015中实现了这一点。 下面是Java脚本代码 有人能给我指出正确的方向吗? 非常感谢, function LoadCountryField(countryFieldName, stateFieldName) {

我在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;
}
函数LoadCountryField(countryFieldName,stateFieldName){
变量$countryField=$(“#”+countryFieldName);
如果($countryField.length<1)返回;
$countryField.hide();
var selectedCountry=$countryField.val();
var countryrequirementvel=Xrm.Page.getAttribute(countryFieldName.getRequiredLevel();
countryrequirementvel=countryrequirementvel==“必需”?2:countryrequirementvel==“建议”?1:0;
var$countryDropdown=generateSelectBox('ddl_'+countryFieldName,countryRequirementLevel,Countries,selectedCountry);
$(“#”+countryFieldName+“#d”).append($countryDropdown);
$countryDropdown.change({'countryFieldName':countryFieldName,'stateFieldName':stateFieldName},handleCountryChanged);
document.getElementById('ddl_33;'+countryFieldName).tabIndex=document.getElementById(countryFieldName).tabIndex;
LoadStateField(stateFieldName,selectedCountry);
}
//根据国家/地区下拉列表的值将stateOrProvince字段配置为下拉列表。值从Countries对象中提取。
函数LoadStateField(stateFieldName,selectedCountry){
var stateAttr=Xrm.Page.getAttribute(stateFieldName);
var selectedState=stateAttr==null?”:stateAttr.getValue();
var状态=getStatesForCountry(selectedCountry);
变量$stateField=$(“#”+stateFieldName);
if(states==null | |!$.isArray(states)| | states.length<1){
$('#ddl'+stateFieldName).remove();
$stateField.show();
返回;
}
$stateField.hide();
var stateRequirementLevel=Xrm.Page.getAttribute(stateFieldName).getRequiredLevel();
stateRequirementLevel=stateRequirementLevel==“必需”?2:stateRequirementLevel==“建议”?1:0;
var$stateDropdown=generateSelectBox('ddl_u'+stateFieldName,stateRequirementLevel,states,selectedState);
var$existingDropdown=$('#ddl'+stateFieldName);
如果($existingDropdown.length<1)
$('#'+stateFieldName+''u d')。追加($stateDropdown);
其他的
$existingDropdown.replaceWith($stateDropdown);
$stateDropdown.change({'stateFieldName':stateFieldName},handleStateChanged);
$stateDropdown.change();
document.getElementById('ddl_33;'+stateFieldName).tabIndex=document.getElementById(stateFieldName).tabIndex;
}
//使用Countries对象查找与selectedCountry关联的州。
函数getStatesForCountry(selectedCountry){
(i)国家/地区{
var国家=国家[i];
如果(selectedCountry==country.name)
返回国家/地区;
}
返回[];
}
//将“国家/地区”字段的值设置为新选择的值,并重新配置“从属状态”下拉列表。
函数handleCountryChanged(eventData){
var stateFieldName=eventData.data.stateFieldName;
var selectedCountry=setfieldfrom下拉列表(eventData.data.countryFieldName);
LoadStateField(stateFieldName,selectedCountry);
}
//将stateOrProvince字段的值设置为新选择的值
函数handleStateChanged(事件数据){
setFieldFromDropdown(eventData.data.stateFieldName);
}
//基于相关下拉列表的值设置字段的值
函数SetFieldFrom下拉列表(fieldName){
变量$dropdown=$('#ddl'+字段名);
如果($dropdown.length!=1),则返回null;
var selectedValue=$dropdown.find('option:selected:first').val();
var attr=Xrm.Page.getAttribute(字段名);
如果(attr!=null)attr.setValue(selectedValue);
返回selectedValue;
}
//为MS CRM 2011生成具有适当属性的新选择框。
函数生成选择框(id、要求级别、选项、所选值){
变量$ddl=$('');

$ddl.append(jQuery(“如果您的选项集包含所有值,则您的代码不受支持,您可以使用依赖的optionset MSDN示例


现在还不完全清楚您在做什么,但看起来您使用的是不受支持的JavaScript,您不应该期望它能够正常工作

这类调用
getElementById
,这一位看起来像是
generateSelectBox
添加自定义控件,以及所有jQuery

与Microsoft Dynamics CRM应用程序页面的所有交互必须 只能通过使用Xrm.Page或Xrm.Utility的方法执行 客户端编程参考中记录的名称空间。 直接访问任何Microsoft的文档对象模型(DOM) 不支持Dynamics CRM应用程序页。在中使用jQuery 不建议使用表单脚本和命令。详细信息:使用 jQuery

所以我希望用受支持的东西来替换尽可能多的不受支持的东西


对于表单重新加载上的空白字段,可能是因为该字段未保存到数据库中。CRM需要知道该字段是
脏的
,才能提交更改。如果该字段是只读的,有时可能会导致问题,因为CRM不希望该字段是
脏的
。我建议对该实体启用审核验证CRM是否确实在将字段保存到数据库。

保存表单后,浏览器会刷新,是吗?在没有看到Countries对象的情况下,我假设states是一个对象数组,每个对象都有一个名称值?@SamR,是的correct@YogeshJagdale是的,那一定会发生。嘿,谢谢你的链接,我已经实现了t代码,但是