首页 > 代码库 > ASPxComboBox控件联动效果bug改进

ASPxComboBox控件联动效果bug改进

原文:ASPxComboBox控件联动效果bug改进

  在应用第三方控件DevExpress控件的时候,大家应该对ASPxComboBox控件应该不是很陌生吧,尤其在做多级联动效果的时候,有着它独特的地方,通过前台控制可以实现异步刷新。但是在实际做项目中,我发现它存在一定的问题。

      比如,我们做四级联动效果,四级分别为案件类型、案件性质、性质分类、性质细类,选择案件类型时,触发案件性质数据加载;选择案件性质时,性质分类数据加载,依次类推……;当我们将四级数据都加载到控件中的时候,如果我们重新选择案件类型(第一级)时,此时你会发现,二级内容重新加载了,但是三级四级内容没有清空,也没有变化,应该说这是不符合条件的,针对这个问题,我设计了下面解决方案

      源代码:

   

<table border="1" cellpadding="0" cellspacing="0" style="width:100%">
   <tr>
      <td>
          <dx:ASPxComboBox runat="server" ID="CbxAJLX" ClientInstanceName="cbxAJLX" DropDownStyle="DropDownList" TextField="AJLX" ValueField="AJLX" Width="80px" OnCallback="CbxAJLX_Callback">
              <ClientSideEvents SelectedIndexChanged="function(s, e) { OnAJLXChanged(s); }" />
          </dx:ASPxComboBox>
      </td>
      <td>
          <dx:ASPxComboBox runat="server" ID="CbxAJXZ" ClientInstanceName="cbxAJXZ" DropDownStyle="DropDownList" TextField="AJXZ" ValueField="AJXZ" Width="80px" OnCallback="CbxAJXZ_Callback">
              <ClientSideEvents SelectedIndexChanged="function(s, e) { OnAJXZChanged(s); }" />
          </dx:ASPxComboBox>
      </td>
      <td>
          <dx:ASPxComboBox runat="server" ID="CbxXZFL" ClientInstanceName="cbxXZFL" DropDownStyle="DropDownList" TextField="XZFL" ValueField="XZFL" Width="80px" OnCallback="CbxXZFL_Callback">
              <ClientSideEvents SelectedIndexChanged="function(s, e) { OnXZFLChanged(s); }" />
          </dx:ASPxComboBox>
      </td>
      <td>
          <dx:ASPxComboBox runat="server" ID="CbxXZXL" ClientInstanceName="cbxXZXL" DropDownStyle="DropDownList" TextField="XZXL" ValueField="XZXL" Width="80px" OnCallback="CbxXZXL_Callback">
          </dx:ASPxComboBox>
      </td>
    </tr>
</table>

  我先解释一下该代码吧,OnCallback事件时用于自身更新数据的,主要时通过上一级事件SelectedIndexChanged触发,其主要内容为cbxAJXZ.PerformCallback(cbxAJLX.GetValue().toString())。

  针对不能清空问题,在下级数据更新之前,我设计了一个方法,用于清空下级后面的所有联动控件中的数据,代码如下

function OnAJLXChanged(cbxAJLX) {
     myAjlx("clear");
     cbxAJXZ.PerformCallback(cbxAJLX.GetValue().toString());
}
function myAjlx(cmd) {
      if (cmd == "clear") {
            cbxAJXZ.SetValue(null);
            cbxXZFL.SetValue(null);
            cbxXZXL.SetValue(null);
      }
}

  通过调用上面这段代码可以实现多级数据联动不足的地方,下面是整个脚本

function OnAJLXChanged(cbxAJLX) {
            myAjlx("clear");
            cbxAJXZ.PerformCallback(cbxAJLX.GetValue().toString());
        }
        function OnAJXZChanged(cbxAJXZ) {
            myAjxz("clear");
            cbxXZFL.PerformCallback(cbxAJXZ.GetValue().toString());
        }
        function OnXZFLChanged(cbxXZFL) {
            myXzfl("clear");
            cbxXZXL.PerformCallback(cbxXZFL.GetValue().toString());
        }
        function myYwlx(cmd) {
            if (cmd == "clear") {
                cbxAJLX.SetValue(null);
                cbxAJXZ.SetValue(null);
                cbxXZFL.SetValue(null);
                cbxXZXL.SetValue(null);
            }
        }
        function myAjlx(cmd) {
            if (cmd == "clear") {
                cbxAJXZ.SetValue(null);
                cbxXZFL.SetValue(null);
                cbxXZXL.SetValue(null);
            }
        }
        function myAjxz(cmd) {
            if (cmd == "clear") {
                cbxXZFL.SetValue(null);
                cbxXZXL.SetValue(null);
            }
        }
        function myXzfl(cmd) {
            if (cmd == "clear") {
                cbxXZXL.SetValue(null);
            }
        }

  注意:最后一级不用调用脚本进行清空

  本文主要解决了,多级联动过程中,联动数据不能及时清空的问题;本文只代表本人个人观点,希望广大博友提出好的建议和意见,谢谢~