comboboxTree的使用

comboboxTree的使用:

        由于系统中的下拉机构树及专栏模块树的内容太多,下拉框会拉的好长,客户要求可以把它们折叠起来。所以就在网上看到了Ext的comboboxTree下拉树。下面简单介绍一下它的使用。

1、首先在页面引入Ext及ComboBoxTree的定义和CSS样式:

<link rel="stylesheet" type="text/css" href="/commonExt/page/ext-2.2.1/resources/css/ext-all.css" />
 <script language="javascript" type="text/javascript" src="/InfoIssue/page/jscripts/ext.js"></script>
 <script  language="javascript" type="text/javascript"  src="/commonExt/page/ext-2.2.1/ext-all.js"></script>
 <script  language="javascript" type="text/javascript"  src="/commonExt/page/ext-2.2.1/ComboBoxTree.js"></script>

 

2、ComboBoxTree.js内容如下:

/**  
 * Ext下拉树定义  
 * 2010-05-13
 */ 
  Ext.ux.ComboBoxTree = function(){
 this.treeId = Ext.id()+'-tree';
 this.maxHeight = arguments[0].maxHeight || arguments[0].height || this.maxHeight;
 this.tpl = new Ext.Template('<tpl for="."><div style="height:'+this.maxHeight+'px"><div id="'+this.treeId+'"></div></div></tpl>');
 this.store = new Ext.data.SimpleStore({fields:[],data:[[]]});
 this.selectedClass = '';
 this.mode = 'local';
 this.triggerAction = 'all';
 this.onSelect = Ext.emptyFn;
 this.editable = false;
 this.emptyText = '请选择...',
  //all:所有结点都可选中
 //exceptRoot:除根结点,其它结点都可选
 //folder:只有目录(非叶子和非根结点)可选
 //leaf:只有叶子结点可选
 this.selectNodeModel = arguments[0].selectNodeModel || 'exceptRoot';
 Ext.ux.ComboBoxTree.superclass.constructor.apply(this, arguments);
}

Ext.extend(Ext.ux.ComboBoxTree,Ext.form.ComboBox, {
 
 expand : function(){
  Ext.ux.ComboBoxTree.superclass.expand.call(this);
  if(!this.tree.rendered){
   this.tree.height = this.maxHeight;
   this.tree.border=false;
   this.tree.autoScroll=true;
         if(this.tree.xtype){
    this.tree = Ext.ComponentMgr.create(this.tree, this.tree.xtype);
   }
   this.tree.render(this.treeId);
         var combox = this;
         this.tree.on('click',function(node){
          var isRoot = (node == combox.tree.getRootNode());
          var selModel = combox.selectNodeModel;
          var isLeaf = node.isLeaf();
          
          if(isRoot && selModel != 'all'){
           return;
          }else if(selModel=='folder' && isLeaf){
           return;
          }else if(selModel=='leaf' && !isLeaf){
           return;
          }
          combox.setValue(node);
          combox.collapse();
         });
   var root = this.tree.getRootNode();
   if(!root.isLoaded())
    root.reload();
  }
    },
    
 setValue : function(node){
        var text = node.text;
        this.lastSelectionText = text;
        if(this.hiddenField){
            this.hiddenField.value = node.id;
        }
        Ext.form.ComboBox.superclass.setValue.call(this, text);
        this.value = node.id;
    },
    
    getValue : function(){
     return typeof this.value != 'undefined' ? this.value : '';
    },
    
    clearValue : function() {   
        if (this.passField) {   
            this.passField.value = '';   
        }   
        this.setRawValue('');   
   }
   });

Ext.reg('combotree', Ext.ux.ComboBoxTree);

 

3、在页面加入comboBoxTree的引用:

<%@ page language="java" contentType="text/html; charset=GB2312"%>
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <title>Customizing ComboBoxTree</title>
 <link rel="stylesheet" type="text/css" href="/commonExt/page/ext-2.2.1/resources/css/ext-all.css" />
 <script language="javascript" type="text/javascript" src="/InfoIssue/page/jscripts/ext.js"></script>
 <script  language="javascript" type="text/javascript"  src="/commonExt/page/ext-2.2.1/ext-all.js"></script>
 <script  language="javascript" type="text/javascript"  src="/commonExt/page/ext-2.2.1/ComboBoxTree.js"></script>
<script type="text/javascript">
 var comboBoxTree;
 Ext.BLANK_IMAGE_URL = '/commonExt/page/ext-2.2.1/resources/images/default/s.gif';
 Ext.onReady(function(){
  comboBoxTree = new Ext.ux.ComboBoxTree({
   renderTo : 'comboBoxTree',
   width : 350,  

   tree : {
      xtype:'treepanel',
      loader: new Ext.tree.TreeLoader({dataUrl:'ctbTestFlow.pr.prGetJsonData.do'}),
             root : new Ext.tree.AsyncTreeNode({id:'0',text:'根结点'})
        },
        
     //all:所有结点都可选中
     //exceptRoot:除根结点,其它结点都可选(默认)
     //folder:只有目录(非叶子和非根结点)可选
     //leaf:只有叶子结点可选
     selectNodeModel:'exceptRoot'
    });        
   });
   function showValue(){
    alert(comboBoxTree.getValue());
   }
 </script>
 </head>
 <body>
  <table>
   <tr>
    <td>&nbsp;</td>
    <td> <div id="comboBoxTree"></div> </td>
   </tr>
  </table>
 </body>
</html>

 

4、写一个构件把相应的数据转换成Json对象:

package com.starit.utils;
import org.w3c.dom.*;

import com.primeton.business.bncommon.bizlet.util.BNXmlUtil;
import com.primeton.tp.core.api.BizContext;
/**
 * @author zqding
 * @version 1.0
 * @date 2010-5-12
 * @class_displayName ConvertJsonData
 * 
 */

public class ConvertJsonData {

 /**
  * 转换的形式为[{......},{......},{......}.....]
  * @param doc type: Document, DOM;
  * @param param type: BizContext;
  * @return: int ,运算逻辑返回值,如果失败返回0,成功返回1 
  * @throws Exception 
  * <p>
  * ** bizlet 的显示名称 **
  * @bizlet_displayName ConvertJson
  * @bizlet_param passing="in" type="EOSEntityList" value="list" name="" desc=""
  * @bizlet_param passing="in_out" type="field" value="str" name="" desc=""
  */
 public static int GetJsonData(Document doc, BizContext param)
  throws Exception {
  
  Node node = (Node) param.getParaObjectAt(0);
  Node str = (Node) param.getParaObjectAt(1);
  StringBuffer strBuffer = new StringBuffer("[");
  NodeList entityNodeList = node.getChildNodes();
  for(int i=0; i<entityNodeList.getLength();i++) {
   Node entityNode = entityNodeList.item(i);
   NodeList fieldNodeList = entityNode.getChildNodes();
   strBuffer.append("{");
   boolean flag_1 = true;
   for(int j=0;j<fieldNodeList.getLength();j++) {
    Node fieldNode = fieldNodeList.item(j);
    if(!flag_1) {
     strBuffer.append(", ");
    } else {
     flag_1 = false;
    }
    strBuffer.append(fieldNode.getNodeName()+" : \""+fieldNode.getFirstChild()+"\"");
   }
   strBuffer.append("}");
   if(i!=(entityNodeList.getLength()-1))
   {
    strBuffer.append(", ");
   }
  }
  strBuffer.append("]");
  BNXmlUtil.setNodeValue(str, new String(strBuffer));
  return 1;
 }
 }

 

5、把转换成的Json对象作为comboboxTree的数据out出去:

<%@include file="/internet/common.jsp"%>
<%@ page import="com.primeton.tp.core.prservice.context.RequestContext"%>
<%
try {
 RequestContext requestContext = (RequestContext) request.getAttribute(RequestContext.REQUEST_REQUEST_CONTEXT);
 String jsonData = requestContext.getProperty("str"); //根据xPath获取相应的节点的值。
 StringBuffer jsonDataBuffer = new StringBuffer(jsonData); 
 out.print(jsonDataBuffer);
 System.out.println(jsonDataBuffer);
 out.flush();  
 //out.close(); 
} catch (Exception e) {
 e.printStackTrace();
}
%>

 

6、最终效果如下所示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF Comboboxtree是一种特殊的下拉式菜单控件,它结合了ComboboxTreeview的功能,能够展示具有层级结构的数据。 WPF Comboboxtree控件在用户点击时展开,展开后呈现出一个树状结构,类似于Treeview控件。用户可以通过点击树节点来选择所需的数据。与普通的Combobox不同,WPF Comboboxtree可以展示多个层级的数据,并且通过缩进的方式显示层次关系。 WPF Comboboxtree的优点在于它能够在有限的控件空间内展示更多的数据,而不需要用户一级一级地展开树节点。它可以更方便地选择包含在层级结构中的数据项。 在使用WPF Comboboxtree时,我们首先需要将数据源绑定到Comboboxtree上。数据源通常是一个集合,其中每个对象代表一个树节点。我们可以为每个节点指定其子节点的属性,这样就能够构建出有层级关系的树。 接下来,我们需要指定显示节点文本的属性,并将该属性绑定到Comboboxtree的显示文本上。这样,在展开树选择数据时,Comboboxtree就能够正确地显示节点的文本。 最后,为了响应用户的选择,我们需要处理Comboboxtree的选择事件。在事件处理方法中,我们可以根据用户选择的节点来获取相关的数据,并进行相应的处理。 总之,WPF Comboboxtree是一种功能强大的下拉式菜单控件,它提供了展示层级结构数据的便捷方式,能够满足用户在选择层级数据时的需求。 ### 回答2: WPF的ComboBoxTree是一种组合控件,结合了ComboBoxTreeView的功能,可以实现在下拉菜单中显示树状结构的数据。 使用ComboBoxTree可以方便地实现多级目录选择,例如选择省市县地区等。通过设置ItemsSource属性,可以将树状结构的数据绑定到ComboBoxTree上,使得用户可以通过展开和折叠节点的方式浏览和选择数据。 同时,ComboBoxTree还支持通过键盘输入进行快速筛选,例如用户可以通过键盘输入“北”来选中北京等城市。还可以通过设置显示属性,将树状结构的数据中的指定属性显示在下拉菜单中,方便用户直接选择。 除此之外,ComboBoxTree还支持事件处理,例如当用户选择某个节点时,可以通过Selected事件来处理相应的逻辑。可以使用SelectedItem属性来获取用户选择的节点。 总之,WPF的ComboBoxTree是一种非常实用的控件,可以方便地实现树状结构数据的展示和选择。无论是用来展示地区数据还是其他层级数据,都可以通过ComboBoxTree来简化开发工作并提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值