最近做项目要在winform下做个多表头的报表,而C#下的datagridview不象可以简单的通过重构表头来实现。所以只好自己重写datagridview控件的表头,而从网上查了一点资料,可以通过重写表头来实现。有一个是用树来表示表头的,由于我的表头的列很多,如果手工一行一行的添加结点,重复代码量很多,于是自己根据一定规则的字条串来生成一个树,
代码:(C#)
主函数
public TreeView CreaterTree(string strHeader)
{
TreeView treeTemp = new TreeView();
treeTemp.Nodes.Add("root");
CreateTreeSubNode(treeTemp, strHeader, 0);
return treeTemp;
}
//递归生成子结点
protected void CreateTreeSubNode(TreeView treeParent, string strHeader, int intLevel)
{
if (strHeader == "")
{
return;
}
TreeNode treeNow = treeParent.Nodes[0];
//找观察家当前结点的父结点
for (int i = 0; i < intLevel; i++)
{
treeNow = treeNow.Nodes[treeNow.Nodes.Count - 1];
}
int intRoot = 0;
int intParent = 0;
int intMin = 0;
string strNowNodeName = "";
string strLastName = "";
intRoot = strHeader.IndexOf('[');
intParent = strHeader.IndexOf(']');
if (intRoot == -1)
{
intRoot = int.MaxValue;
}
if (intParent == -1)
{
intParent = int.MaxValue;
}
intMin = Math.Min(intRoot, intParent);
if (intMin == int.MaxValue)
{
//最后一个结点
strNowNodeName = strHeader.TrimEnd(']');
strNowNodeName = strNowNodeName.TrimStart(',');
strLastName = "";
}
else
{
strNowNodeName = strHeader.Substring(0, intMin);
strLastName = strHeader.Substring(intMin + 1);
if (intRoot == intMin)
{
//当前结点为根结点
intLevel++;
}
else if (intParent == intMin)
{
intLevel--;
}
}
string[] strTree = strNowNodeName.TrimStart(',').TrimEnd(',').Split(',');
foreach (string strnode in strTree)
{
if (strnode != "")
{
treeNow.Nodes.Add(strnode);
}
}
CreateTreeSubNode(treeParent, strLastName, intLevel);
}
树型结构字符串为:strHeader="结一[结一一,结一二],结点二[结点一二,结点二二],结点3,结点4"
调用方法:CreaterTree(strHeader)
生成的树结构相信大家一看就知道了。
代码:(C#)
主函数
public TreeView CreaterTree(string strHeader)
{
TreeView treeTemp = new TreeView();
treeTemp.Nodes.Add("root");
CreateTreeSubNode(treeTemp, strHeader, 0);
return treeTemp;
}
//递归生成子结点
protected void CreateTreeSubNode(TreeView treeParent, string strHeader, int intLevel)
{
if (strHeader == "")
{
return;
}
TreeNode treeNow = treeParent.Nodes[0];
//找观察家当前结点的父结点
for (int i = 0; i < intLevel; i++)
{
treeNow = treeNow.Nodes[treeNow.Nodes.Count - 1];
}
int intRoot = 0;
int intParent = 0;
int intMin = 0;
string strNowNodeName = "";
string strLastName = "";
intRoot = strHeader.IndexOf('[');
intParent = strHeader.IndexOf(']');
if (intRoot == -1)
{
intRoot = int.MaxValue;
}
if (intParent == -1)
{
intParent = int.MaxValue;
}
intMin = Math.Min(intRoot, intParent);
if (intMin == int.MaxValue)
{
//最后一个结点
strNowNodeName = strHeader.TrimEnd(']');
strNowNodeName = strNowNodeName.TrimStart(',');
strLastName = "";
}
else
{
strNowNodeName = strHeader.Substring(0, intMin);
strLastName = strHeader.Substring(intMin + 1);
if (intRoot == intMin)
{
//当前结点为根结点
intLevel++;
}
else if (intParent == intMin)
{
intLevel--;
}
}
string[] strTree = strNowNodeName.TrimStart(',').TrimEnd(',').Split(',');
foreach (string strnode in strTree)
{
if (strnode != "")
{
treeNow.Nodes.Add(strnode);
}
}
CreateTreeSubNode(treeParent, strLastName, intLevel);
}
树型结构字符串为:strHeader="结一[结一一,结一二],结点二[结点一二,结点二二],结点3,结点4"
调用方法:CreaterTree(strHeader)
生成的树结构相信大家一看就知道了。