您的位置:首页 > 其它

一个通用的绑定UltraWebTree树结构

2008-09-06 21:44 477 查看
UltraWebTree是Infragistics NetAdvantage for .net第三方UI控件库中的树型控件,功能强大,对客户端支持很好.在程序开发中经常要用到树,用来分层过滤数据,现在写一个通用的方法,实现无现层的树结构.

一.定义一个树结点存储的对象,存放在节点DataKey属性中

[Serializable()]
public class tnodedata
{
public string str_data; //前台值
public string filter_str;//过滤串 and 结构
public string value_data;//后台值
public string fieldname;
public string levelcode;
public int level;
public override string ToString()
{
return value_data;//方便在客户端得到此值
}
}

二.实现方法

/// <summary>
/// 实现把字符串,按分隔符,生成ArrayList
/// </summary>
/// <param name="str"></param>
/// <param name="sepa"></param>
/// <returns></returns>
public ArrayList split_local(string str, string sepa)
{
ArrayList temp_array;
string temp_str;
temp_array = new ArrayList();
temp_str = str;
while (temp_str.Length > 0)
{
if (temp_str.IndexOf(sepa) > 0)
{
temp_array.Add(temp_str.Substring(0, temp_str.IndexOf(sepa)).Trim());
}
else
{
temp_array.Add(temp_str.Trim());
temp_str = "";
goto exitWhileStatement0;
}
temp_str = temp_str.Substring(temp_str.IndexOf(sepa) + sepa.Length);
}
exitWhileStatement0: ;
return temp_array;
}

/// <summary>
/// 提供根据DataTable,绑定结构树
/// </summary>
/// <param name="tv">树控件ID</param>
/// <param name="parent_node"> 父项目名称,没有时为null</param>
/// <param name="field_lst">后台字段列表,用于控制(ID)</param>
/// <param name="title_lst">前台字段列表,用于显示(TItle)</param>
/// <param name="dtbl">DataTable,按order by 已排序</param>
/// <param name="recursive_level">递归的层次数</param>
public void Get_Tree(UltraWebTree tv, Node parent_node, string field_lst, string title_lst, DataTable dtbl, int recursive_level)
{
Get_Tree(tv, parent_node, field_lst, title_lst, dtbl, recursive_level, ",");
}

public void Get_Tree(UltraWebTree tv, Node parent_node, string field_lst, string title_lst, DataTable dtbl, int recursive_level, string sp_field)
{
Get_Tree(tv, parent_node, field_lst, title_lst, dtbl, recursive_level, sp_field, ",");
}

public void Get_Tree(UltraWebTree tv, Node parent_node, string field_lst, string title_lst, DataTable dtbl, int recursive_level, string sp_field, string sp_title)
{
ArrayList field_array;
ArrayList title_array;
field_array = split_local(field_lst, sp_field);
title_array = split_local(title_lst, sp_title);
this.Get_Tree(tv, parent_node, field_array, title_array, dtbl, recursive_level);
}

private bool Get_Tree(UltraWebTree tv, Node parent_node, ArrayList field_lst, ArrayList title_lst, DataTable dtbl, int recursive_level)
{
int i;
int j;
int k;
int min_level;
ArrayList old_key_lst;
ArrayList old_data_lst;
Node Node;
Node node_new;
tnodedata data;
string field_name;
string tmp_field;
string disp_title;
bool Get_Tree;
Get_Tree = false;
if (dtbl == null)
{
return Get_Tree;
}
try
{

min_level = System.Math.Min(recursive_level, dtbl.Columns.Count);
old_data_lst = new ArrayList();
old_key_lst = new ArrayList();
for (i = 0; i <= min_level - 1; i++)
{
old_data_lst.Add("----");
old_key_lst.Add("----");
}
for (i = 0; i < dtbl.Rows.Count; i++)
{
for (j = 0; j <= min_level - 1; j++)
{
data = new tnodedata();
data.level = j;
tmp_field = title_lst[j].ToString();
field_name = field_lst[j].ToString();
disp_title = dtbl.Rows[i][tmp_field].ToString();
data.str_data = disp_title;
data.value_data = dtbl.Rows[i][field_name].ToString();
data.fieldname = field_name;
data.filter_str = data.fieldname + "='" + (data.value_data) + "'";
Node = new Node();
Node.Text = dtbl.Rows[i][tmp_field].ToString();
Node.ImageUrl = "../images/treeimage.gif";
Node.SelectedImageUrl = "../images/treeSelectedImag.gif";
Node.DataKey = data;
if (((string)(old_key_lst[j])) != dtbl.Rows[i][field_name].ToString())
{
if (j == 0)
{
if (parent_node == null)
{
tv.Nodes.Add(Node);
}
else if (parent_node.DataKey != null)
{
if (((tnodedata)(parent_node.DataKey)).filter_str != "")
{
data.filter_str = data.filter_str + " and " + ((tnodedata)(parent_node.DataKey)).filter_str;
parent_node.Nodes.Add(Node);
}
}
}
else
{
node_new = ((Node)(old_data_lst[j - 1]));
if (node_new != null)
{
if (node_new.DataKey != null)
{
if (((tnodedata)(node_new.DataKey)).filter_str != "")
{
data.filter_str = data.filter_str + " and " + ((tnodedata)(node_new.DataKey)).filter_str;
}
}
node_new.Nodes.Add(Node);
}
}
old_data_lst[j] = Node;
old_key_lst[j] = dtbl.Rows[i][field_name];
for (k = j + 1; k <= min_level - 1; k++)
{
old_data_lst[k] = "----";
old_key_lst[k] = "----";
}
}
}
}

old_data_lst.Clear();
}
catch (Exception es)
{
throw new Exception(es.Message);
}

return Get_Tree;
}

三调用说明

treeShop:UltraWebTree ,//Infragistics.WebUI.UltraWebNavigator

dtbl:DataTable ,必须是按字段排序,因为处理过程是从表的第一行,依次处理,只有一层可以不排,就按表的自然顺序

lev1_mc,lev2_mc,lev3_mc:每一层的显示字段名称,lev1_mc:第一层的字段名称

lev1_id,lev2_id,lev3_id :每一层的控制字段名称,lev1_id第一层的字段名称

1)field_lst与title_lst取同的字段

//字段顺序无关

string sqlstr = "select lev1_mc,lev2_mc,lev3_mc from table1 order by lev1_mc,lev2_mc,lev3_mc";
DataTable dtbl = GetDataTable(sqlstr);
Get_Tree(treeShop, null, "lev1_mc,lev2_mc,lev3_mc", "lev1_mc,lev2_mc,lev3_mc", dtbl, 3);

//支持字段合并,分组等复杂SQL语句

//string sqlstr = "select lev1_mc,lev2_mc||lev3_mc as mc from table1 order by lev1_mc,lev2_mc,lev3_mc";
// Get_Tree(treeShop, null, "lev1_mc,mc", "lev1_mc,mc", dtbl, 2);

2)field_lst与title_lst取不同的字段

string sqlstr = "select lev1_mc,lev2_mc,lev3_mc,lev1_id,lev2_id,lev3_id from table1 order by lev1_mc,lev2_mc,lev3_mc";
DataTable dtbl = GetDataTable(sqlstr);
Get_Tree(treeShop, null, "lev1_id,lev2_id,lev3_id"lev1_mc,lev2_mc,lev3_mc", dtbl, 3);

//Get_Tree(treeShop, treeShop.SelectedNode, "lev1_id,lev2_id,lev3_id"lev1_mc,lev2_mc,lev3_mc", dtbl, 3); //增加到当前选择的节点

四对树的操作

//treeShop的服务端事件

protected void treeShop_NodeClicked(object sender, Infragistics.WebUI.UltraWebNavigator.WebTreeNodeEventArgs e)
{

//按字段结构组合的where 条件

//根据选择树的层次的不同,filter_str不同

//如:1层: lev1_id= '1111' ; 2层: lev1_id= '1111' and lev2_id='2222' ;3层: lev1_id= '1111' and lev2_id='2222' and lev2_id='ffff'

string fstStr = ((tnodedata)e.Node.DataKey).filter_str;

// BindGridData(fstStr);

string lev2_id = ((tnodedata)e.Node.DataKey).value_data;//当前层不value值;
BindGridData2(lev2_id );
}

使用vs2003开发的,所以没有泛型,在Vs2003,2008中编译通过
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: