今天在学习布局的过程中,有个申请部门。就想到Dropdownlist+TreePanel,看DEMO有这样的,但是后台如何搞呢?
请教DB后终于搞定了。
前台:
<ext:DropDownField ID="ddldepartment" runat="server" Editable="false" FieldLabel="申请单位" AnchorHorizontal="100%" >
<Component>
<ext:TreePanel ID="TreePanel1" runat="server" Icon="ApplicationHome" Height="300"
Shadow="None" UseArrows="true" AutoScroll="true" Animate="true" EnableDD="true"
ContainerScroll="true" RootVisible="false">
<Buttons>
<ext:Button ID="btnclose" runat="server" Text="关闭">
<Listeners>
<Click Handler="#{ddldepartment}.collapse();" />
</Listeners>
</ext:Button>
</Buttons>
<Root>
</Root>
<Listeners>
<CheckChange Handler="this.dropDownField.setValue(getTasks(this), false);" />
</Listeners>
</ext:TreePanel>
</Component>
<Listeners>
<Expand Handler="this.component.getRootNode().expand(true);" Single="true" Delay="10" />
</Listeners>
</ext:DropDownField>
后台:
protected void Page_Load(object sender, EventArgs e)
{
if (!X.IsAjaxRequest)
{
string strsql = "select * from Framework";
DABaseAccess db = new DABaseAccess("OA");
DataTable dt = new DataTable();
dt = db.Query(strsql.ToString());
if (dt.Rows.Count > 0)
{
this.BuildTree(this.TreePanel1.Root, dt);
}
else
{
JScript.Alert("没有取得数据", this.Page);
}
}
}
/// <summary>
/// TreePanel
/// </summary>
/// <param name="allData"></param>
/// <returns></returns>
public TreeNode BindTreePanel(DataTable allData)
{
TreeNode topNode = new TreeNode();
topNode.NodeID = "0";
topNode.Text = "Root";
if (allData != null && allData.Rows.Count > 0)
{
DataRow[] items = allData.Select("FParentID=-1");
if (items != null && items.Length > 0)
{
DataSet ds = new DataSet();
ds.Merge(items);
DataTable SourseTable = ds.Tables[0];
for (int i = 0; i < SourseTable.Rows.Count; i++)
{
TreeNode Tvn = new TreeNode();
Tvn.Expandable = ThreeStateBool.True;
Tvn.NodeID = SourseTable.Rows[i]["FID"].ToString();
Tvn.Text = SourseTable.Rows[i]["FNAME"].ToString();
DataRow[] isChildNode = allData.Select("fparentid=" + SourseTable.Rows[i]["FID"].ToString());
if (isChildNode.Length <= 0)
{
Tvn.Leaf = true;
Tvn.Checked = Ext.Net.ThreeStateBool.False;
}
if (isChildNode.Length > 0) Tvn.Icon = Icon.FolderGo;
else Tvn.Icon = Icon.Table;
BindSubTreePanel(Tvn, allData, SourseTable.Rows[i]["FID"].ToString());
topNode.Nodes.Add(Tvn);
}
}
}
return topNode;
}
private void BindSubTreePanel(TreeNode TrNode, DataTable allData, string parentID)
{
DataRow[] items = allData.Select("FParentID=" + parentID);
if (items != null && items.Length > 0)
{
DataSet ds = new DataSet();
ds.Merge(items);
DataTable dt = ds.Tables[0];
for (int i = 0; i < dt.Rows.Count; i++)
{
TreeNode Tvn = new TreeNode();
Tvn.Icon = Icon.Note;
Tvn.NodeID = dt.Rows[i]["FID"].ToString();
Tvn.Text = dt.Rows[i]["FNAME"].ToString();
DataRow[] isChildNode = allData.Select("fparentid=" + dt.Rows[i]["FID"].ToString());
if (isChildNode.Length <= 0)
{
Tvn.Leaf = true;
Tvn.Checked = Ext.Net.ThreeStateBool.False;
}
if (isChildNode.Length > 0) Tvn.Icon = Icon.FolderGo;
else Tvn.Icon = Icon.Table;
BindSubTreePanel(Tvn, allData, dt.Rows[i]["FID"].ToString());
TrNode.Nodes.Add(Tvn);
}
}
}
private Ext.Net.TreeNodeCollection BuildTree(Ext.Net.TreeNodeCollection root, DataTable dt)
{
root.Add(this.BindTreePanel(dt));
return root;
}
