之前公司项目做了一个这个,不过我发现有个BUG,就是只能选到2级,然后在下级就不能选中了。不过我这人就是倔脾气来了就非要弄出来。可能一下方法不太完美,但是可以实现,欢迎大家提供更好的方法以及建议。
先说一说前台代码:
先是一个ext:DropDownField控件, <Component>里面嵌套了ext:TreePanel控件。下面只贴ext:TreePanel代码
<ext:TreePanel ID="OptionOrgTree" runat="server" AutoScroll="true" ContainerScroll="true"
RootVisible="false" UseArrows="true" Animate="true" Height="280">
<Store>
<ext:TreeStore ID="OptionOrgStore" runat="server">
<Proxy>
<ext:AjaxProxy Url="/Report/OrgProfit/GetOrgList">
</ext:AjaxProxy>
</Proxy>
<Parameters>
参数,你们懂的
</Parameters>
<Listeners>
<BeforeLoad Handler="SelectedCurrentNodes(App.OptionOrgTree, operation)" />
<Load Handler="SetDefaultNodes(App.OptionOrgTree,node)" />
</Listeners>
</ext:TreeStore>
</Store>
<Listeners>
<CheckChange Fn="dbchangeFrom" />
<Load Handler="treeLoad(item,node,records,successful,options)" />
</Listeners>
<View>
<ext:TreeView ID="TreeView1" runat="server" LoadMask="true" LoadingText="loading...">
</ext:TreeView>
</View>
<SelectionModel>
<ext:TreeSelectionModel ID="TreeSelectionModel3" runat="server" Mode="Single">
</ext:TreeSelectionModel>
</SelectionModel>
</ext:TreePanel>
注意黄色的的事件,那才是此次重点。
treeLoad事件:
function treeLoad(item, node, records, successful, options) {
loadData();
}
getOrgid(node);
}
loadData事件主要是给TreePanel赋初始值:
var root = App.OptionOrgTree.getRootNode();
if (a[i].Key == "OrgID" && a[i].Value != null) {
getChildNodesNuchecked(root);
App.ddfOrgNameId.setValue(a[i].Value, result.OrgName, true);
遍历树形节点,并且不选中
function getChildNodesNuchecked(root) {
for (var p = 0; p < root.childNodes.length; p++) {
var item = root.childNodes[p]; item.set("checked", false);
getChildNodesNuchecked(item);
}
}
然后看看我们最重要最关键的方法getOrgid(node);
首页第三级等更下级的机构选择
function getOrgid(node) {
var result = parent.getSearchConfig();
var a = Ext.decode(result.ProcParams);
if (a.length > 0) {
for (var i = 0; i < a.length; i++) {
if (a[i].Key == "OrgID" && a[i].Value != null) {
var orgIds = a[i].Value.split(',');
for (var j = 0; j < orgIds.length; j++) {
for (var p = 0; p < node.childNodes.length; p++) {
var item = node.childNodes[p];
if (item.data.id == orgIds[j])
item.set("checked", true);
}
}
}
}
}
}
其实不难看出,大家已经知道是并不是一开始的时候就去遍历树形节点去选中,而是展开树形节点的时候把当前节点传入。其实大家可以试着一加载节点的时候就去选中。因为我初学EXT.NET反复试了几次,它只能读取到已经展开或者展开过的节点,我不知道初始怎么让它全部展开然后又收缩,所以就用了这种比较逗比的方法。如果有时间我就研究研究如何一开始全部展开然后又收缩,到时候在更新这个文章。