如下DataTable,其中有Id列、父Id列和内容Item列,具体数据如下:Id Pid Item
1 0 A
2 1 B
3 1 C
4 2 D
5 2 E
6 3 F
7 3 G
8 3 H请问如何通过遍历以上DataTable得到下面形式的字符串?A>B>D;A>B>E;A>C>F;A>C>G;A>C>H下面是DataTable对应的树型结构: A
/ \
B C
/ \ / | \
D E F G H
1 0 A
2 1 B
3 1 C
4 2 D
5 2 E
6 3 F
7 3 G
8 3 H请问如何通过遍历以上DataTable得到下面形式的字符串?A>B>D;A>B>E;A>C>F;A>C>G;A>C>H下面是DataTable对应的树型结构: A
/ \
B C
/ \ / | \
D E F G H
{
public int ID;
public int PID;
public string NAME;
public PlayNode(int _ID, int _PID, string _NAME)
{
this.ID = _ID;
this.PID = _PID;
this.NAME = _NAME;
}
}
public class Play
{
SortedDictionary<int, PlayNode> Lst = new SortedDictionary<int, PlayNode>();
void ReadNode()
{
Lst.Clear();
string sqlData = "SELECT * FROM PLAY order by id";
DataTable dtDate = DataSQL.Select(sqlData);
if (dtDate != null)
{
for (int i = 0; i < dtDate.Rows.Count; i++)
{
Lst.Add(int.Parse(dtDate.Rows[i]["ID"].ToString().Trim()),new PlayNode(int.Parse(dtDate.Rows[i]["ID"].ToString().Trim()),int.Parse(dtDate.Rows[i]["PID"].ToString().Trim()),dtDate.Rows[i]["NAME"].ToString().Trim()));
}
}
} public string Display()
{
string Outstr = "";
ReadNode();
if (Lst.Count != 0)
{
string sqlData = "SELECT * FROM PLAY where pid in (2,3) order by id";
DataTable dtDate = DataSQL.Select(sqlData);
if (dtDate != null)
{
for (int i = 0; i < dtDate.Rows.Count; i++)
{
Outstr +=DG(int.Parse(dtDate.Rows[i]["PID"].ToString().Trim()), dtDate.Rows[i]["NAME"].ToString().Trim(), Lst)+";";
}
}
}
return Outstr;
} string DG(int PID, string LastStr, SortedDictionary<int, PlayNode> Dict)
{
if (PID != 0)
{
int TmpID = PID;
string TmpLast = LastStr;
foreach (KeyValuePair<int, PlayNode> KP in Dict)
{
if (PID == KP.Key)
{
TmpLast = KP.Value.NAME + ">"+TmpLast;
TmpID = KP.Value.PID ;
break;
}
}
return DG(TmpID, TmpLast, Dict);
}
else return LastStr;
}
}直接调用Display()方法即可
public void CreateTree(int parentID, TreeNode node, DataTable dt, TreeView treeView)
{
//实例化一个DataView dt = 传入的DataTable
dv = new DataView(dt);
//筛选(相当于select * from tabMenu where menuParentID = 传入的 parentID)
dv.RowFilter = "[menuParentID]=" + parentID;
//用foreach遍历dv
foreach (DataRowView row in dv)
{
//第一次加载时为空
if (node == null)
{
//创建根节点
TreeNode root = new TreeNode();
//必须与数据库的对应
root.Text = row["menuName"].ToString();
root.Value = row["menuID"].ToString();
//添加根节点
this.TreeView1.Nodes.Add(root);
//递归调用方法本身
CreateTree(int.Parse(row["menuID"].ToString()), root, dt, treeView);
}
else
{
//添加子节点
TreeNode childNode = new TreeNode();
childNode.Text = row["menuName"].ToString();
childNode.Value = row["menuID"].ToString();
node.ChildNodes.Add(childNode);
CreateTree(int.Parse(row["menuID"].ToString()), childNode, dt, treeView);
}
}
}
}
类似
错误 1 当前上下文中不存在名称“DataSQL”
与绑定TreeView有类似之处,但绑定TreeView是添加子节点,父节点只会出现一次;而现在问题在于,有多少个子节点,父节点就会出现多少次。
/// 根据DataTable中的数据得到特定规则的字符串
/// </summary>
/// <param name="dt">DataTable对象</param>
/// <returns>特定规则的字符串</returns>
public static string GetString(DataTable dt)
{
string strList = string.Empty;
//先对DataTable表中的数据进行整理
ManageDataTable(dt); //对DataTable按Id进行升序排列
DataView dv = new DataView(dt);
dv.Sort = "Id";
dt = dv.ToTable(); //循环调用递归方法组合专利分类字符串
for (int i = 0; i < dt.Rows.Count; i++)
{
strList += dt.Rows[i]["Item"].ToString();
GetString(ref strList, dt, i);
dt.Rows.RemoveAt(i);//移除组合后的项
i--;//循环变量相应减1
strList += ";";
} return strList;
} /// <summary>
/// 整理DataTable表中的数据(使父分类的数量等于子分类之和)
/// </summary>
/// <param name="dt">DataTable对象</param>
private static void ManageDataTable(DataTable dt)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
int pIdCount = 1;
int idCount = 0; for (int j = i + 1; j < dt.Rows.Count; j++)
{
if (dt.Rows[i]["Pid"].ToString() == dt.Rows[j]["Pid"].ToString())
{
pIdCount++;
} if (dt.Rows[i]["Pid"].ToString() == dt.Rows[j]["Id"].ToString())
{
idCount++;
}
} if (pIdCount <= idCount)
{
continue;
} for (int l = 0; l < dt.Rows.Count; l++)
{
if (dt.Rows[i]["Pid"].ToString() == dt.Rows[l]["Id"].ToString())
{
for (int k = 0; k < pIdCount - idCount; k++)
{
DataRow dr = dt.Rows[l];
dt.ImportRow(dr);//重复添加
} i += pIdCount - 1;
break;
}
}
}
} /// <summary>
/// 递归组合字符串
/// </summary>
/// <param name="categoryList">初始字符串</param>
/// <param name="dt">DataTable对象</param>
/// <param name="rowIndex">初始行号</param>
private static void GetString(ref string categoryList, DataTable dt, int rowIndex)
{
for (int i = rowIndex + 1; i < dt.Rows.Count; i++)
{
if (dt.Rows[rowIndex]["Id"].ToString() == dt.Rows[i]["Pid"].ToString())
{
categoryList += "〉" + dt.Rows[i]["Item"].ToString();
GetString(ref categoryList, dt, i);//递归调用自身
dt.Rows.RemoveAt(i);//移除组合后的项
i--;//循环变量相应减1
break;
}
}
}