【问题标题】:How to add break in combobox list from external XML file?如何从外部 XML 文件在组合框列表中添加中断?
【发布时间】:2014-02-22 17:23:44
【问题描述】:

我正在通过 datadic.xml 文件来填充 actionscript 3.0 中的组合框,但我想在前 11 个属性的每个部分之间添加一个中断或标题,然后中断,然后是最后 26 个属性。这是我的 xml 文件的一部分:

<codeSet> 
<title>Census: population estimates for Northern Ireland </title>
<subtitle>By country, region and local authority</subtitle>
<txtSource>2011 Census</txtSource>
<txtSource2>2001Census</txtSource2>
<dateStart>2001</dateStart>
<dateEnd>2011</dateEnd>
<code id='94NI'>NORTHERN IRELAND</code>
<code id='N09000001'>Antrim and Newtownabbey</code>

然后 actionscript 加载 xml 并创建一个名为 setLists 的函数,这是一个用于填充组合框的简单循环,但现在我想放一个 break 所以应该是 Northern Ireland(break)Antrim 和 Newtownabbey,然后是 10 (break)等等。动作脚本代码:

function setLists():void
{
    var menuLength:int = xmlCodes.code.length();
    for (var i:int=0; i<menuLength; i++)
        {
            myVarList1.addItem({label:xmlCodes.code[i].text(), data:xmlCodes.code[i].@id});
            myVarList2.addItem({label:xmlCodes.code[i].text(), data:xmlCodes.code[i].@id});

            if (

        }

【问题讨论】:

    标签: xml actionscript-3 flash combobox


    【解决方案1】:

    如果标题下方的元素数量总是相同,请尝试以下操作:

    function setLists():void
    {
        var menuLength:int = xmlCodes.code.length();
    
        // I'm basing the "breaks" variable on this flow: title, break, 11 items, break, title, break, 26 items
        // 
        var breaks:int = 3;
        var breakCount:int = 0;
        // Note we've added "breaks" to our menuLength
        //
        for (var i:int=0; i<menuLength + breaks; i++)
            {
                // 1, 12, and 14 are where we add breaks based on the flow mentioned above
                //
                if (i == 1 || i == 12 || i == 14) {
                    myVarList1.addItem({label:' ', data:null);
                    myVarList2.addItem({label:' ', data:null);
                    breakCount++;
                } else {
                    myVarList1.addItem({label:xmlCodes.code[i-breakCount].text(), data:xmlCodes.code[i].@id});
                    myVarList2.addItem({label:xmlCodes.code[i-breakCount].text(), data:xmlCodes.code[i].@id});
                }
            }
    

    【讨论】:

    • 所以我知道在正确的位置有中断但是当您单击一个空标签时,它期望数据存在并且使 Flash 应用程序崩溃。有什么办法让你不能点击休息。还有为什么将breaks变量设置为3?
    • 想不出停止点击中断的方法,但是如果您修改检查所选项目数据的函数以检查 null 或您选择的其他一些自定义数据(如断路器或其他) 并让它抛出一条错误消息,指示用户确保他们选择了实际选项。我以为你想要 3 次休息;一个在第一个标题之后,一个在下一个标题之前,一个在该标题之后。根据需要进行调整。
    • 啊,是的,很抱歉,愚蠢的时刻,但感谢您的帮助,最终使它正常工作,非常感谢。
    【解决方案2】:

    我认为id 格式在“类别”和它们的“子级”之间存在差异?此外,XML 提供了一个具有以下模式的排序列表?

    • 类别 1
    • 孩子1
    • 孩子2
    • [...]
    • child3
    • 类别2
    • 孩子1
    • 孩子2
    • [...]
    • child3

    如果是这样,您可以尝试找出 ID 在“类别”和它们的“子级”之间的区别。一种方法是创建一个regular expression,该regular expression 仅匹配属于类别的 ID,并在匹配时采取不同的行动。

    例子:

    var categoryIdPattern:RegExp = /^\d{2,3}\w{2,3}$/; // Matches only strings consisting of 2-3 numbers followed by 2-3 word characters
    
    var menuLength:int = xmlCodes.code.length();
    for (var i:int = 0; i < menuLength; i++) {
        myVarList1.addItem({label:xmlCodes.code[i].text(), data:xmlCodes.code[i].@id});
        if (categoryIdPattern.exec(xmlCodes.code[i].@id as String) != null) {
            //This is a category, add an empty row beneath the newly added value in the combobox
            myVarList1.addItem({label:"", data:null});
        }
    }
    

    编辑:我应该补充一点,上面的代码未经测试,只是说明了这个概念。

    【讨论】:

      【解决方案3】:

      我最终创建了一个新类来覆盖数据设置器,这样我就可以在组合框中将值设置为“禁用:真”

      var myVarList1:ComboBox = new ComboBox();
      var myVarList2:ComboBox = new ComboBox();
      myVarList1.dropdown.setStyle("cellRenderer", MyCustomCellRenderer); 
      myVarList2.dropdown.setStyle("cellRenderer", MyCustomCellRenderer); 
      

      然后在调用我的 setlists 函数时

      function setLists():void
          {
              var menuLength:int = xmlCodes.code.length();
              var breaks:int = 3;
              var breaksCount:int = 0;
      
          for (var i:int=0; i<menuLength; i++)
              {
      
                  if(i == 1){
      
                      myVarList1.addItem({label: " ", disabled:true});
                      myVarList2.addItem({label: " ", disabled:true});                
                      breaksCount++;
                  }
                      else if (i == 11){
                      myVarList1.addItem({label: " ", disabled:true});
                      myVarList2.addItem({label: " ", disabled:true});                    
                      breaksCount++;
                      }
      
                  else {
      
                  myVarList1.addItem({label:xmlCodes.code[i].text(), data:xmlCodes.code[i].@id});
                  myVarList2.addItem({label:xmlCodes.code[i].text(), data:xmlCodes.code[i].@id});
                  }
              }
      

      这是允许您将值设置为禁用的自定义函数。

      package { 
          import fl.controls.listClasses.CellRenderer; 
          public class MyCustomCellRenderer extends CellRenderer
          {
              // override the data setter to set the enabled flag
              override public function set data(value:Object):void
              {
                  super.data = value;    
                  this.enabled = !(value['disabled']);
              }
          } 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-21
        • 2016-05-10
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多