/// <summary>
/// 构造函数
/// </summary>
public DataTableTree2()
{
}
int depth = 0;//深度变量
DataTable dt_Tree = new DataTable();//存放处理后数据的DataTable
#region 属性
private DataTable _tableName = null;
/// <summary>
/// 源数据表(必填)
/// </summary>
public DataTable ATableName
{
set { _tableName = value; }
get { return _tableName; }
}
private string _parentIDFiled = null;
/// <summary>
/// 父级字段即ParentID(必填)
/// </summary>
public string BParentIDFiled
{
set { _parentIDFiled = value; }
get { return _parentIDFiled; }
}
private string _sortStyle = null;
/// <summary>
/// 排序方式,(可选)默认为升序,不填则默认以主键进行升序排列
/// </summary>
public string CSortStyle
{
set { _sortStyle = value; }
get { return _sortStyle; }
}
private string _keyFiled = null;
/// <summary>
/// 主键字段(必填)
/// </summary>
public string DKeyFiled
{
set { _keyFiled = value; }
get { return _keyFiled; }
}
private string _dataTextFiled = null;
/// <summary>
/// 深度列的文本字段名(必填)
/// </summary>
public string EDataTextFiled
{
set { _dataTextFiled = value; }
get { return _dataTextFiled; }
}
private string _depthSign = null;
/// <summary>
/// 深度符号(必填)
/// </summary>
public string FDepthSign
{
set { _depthSign = value; }
get { return _depthSign; }
}
private bool _parentIsAddDepthSign = true;
/// <summary>
/// 第一级是否添加深度符号,(可选)默认已添加深度符号
/// </summary>
public bool GParentIsAddDepthSign
{
set { _parentIsAddDepthSign = value; }
get { return _parentIsAddDepthSign; }
}
#endregion
/// <summary>
/// 获取顶级目录
/// </summary>
/// <returns>DataTable</returns>
public DataTable GetParentTree()
{
dt_Tree = ATableName.Clone();
string strSort = null;
if (!StrIsNull(CSortStyle))
{
strSort = CSortStyle;
}
else
{
strSort = DKeyFiled + " asc";
}
DataRow[] dr = ATableName.Select(BParentIDFiled + "=0", strSort);
foreach (DataRow drrr in dr)
{
if (GParentIsAddDepthSign)
{
drrr[EDataTextFiled] = FDepthSign + drrr[EDataTextFiled].ToString();
}
else
{
drrr[EDataTextFiled] = drrr[EDataTextFiled].ToString();
}
dt_Tree.Rows.Add(drrr.ItemArray);
depth = 0;
if (IsHaveChild(BParentIDFiled, drrr[DKeyFiled].ToString()))
{
GetChildTree(drrr[DKeyFiled].ToString());
}
}
return dt_Tree;
}
/// <summary>
/// 获取子级目录
/// </summary>
/// <param name="ClassID">主键ID值</param>
private void GetChildTree(string ClassID)
{
DataTable dt_ChiledTree = new DataTable();
dt_ChiledTree = ATableName.Clone();
++depth;//深度变量
string strSort = null;
if (!StrIsNull(CSortStyle))
{
strSort = CSortStyle;
}
else
{
strSort = DKeyFiled + " asc";
}
DataRow[] dr = ATableName.Select(BParentIDFiled + "=" + ClassID, strSort);
foreach (DataRow drrr in dr)
{
drrr[EDataTextFiled] = AddDepthSign(depth) + drrr[EDataTextFiled].ToString();
dt_Tree.Rows.Add(drrr.ItemArray);
if (IsHaveChild(BParentIDFiled, drrr[DKeyFiled].ToString()))
{
GetChildTree(drrr[DKeyFiled].ToString());
depth--;
}
}
}
/// <summary>
/// 获取深度符号
/// </summary>
/// <param name="depthVal">深度</param>
/// <returns>深度级数</returns>
private string AddDepthSign(int depthVal)
{
StringBuilder strAdd = new StringBuilder();
if (GParentIsAddDepthSign)
{
for (int i = 0; i <= depthVal; i++)
{
strAdd.Append(FDepthSign);
}
}
else
{
for (int i = 0; i < depthVal; i++)
{
strAdd.Append(FDepthSign);
}
}
return strAdd.ToString();
}
/// <summary>
/// 判断字符串是否为空
/// </summary>
/// <param name="checkStr">检测字符串</param>
/// <returns>true or false</returns>
private bool StrIsNull(string checkStr)
{
bool b = true;
if (!string.IsNullOrEmpty(checkStr) && checkStr != "")
{
b = false;
}
return b;
}
/// <summary>
/// 是否包含子栏目
/// <param name="ParentIDFiled">父节点字段名</param>
/// <param name="ClassID">父节点栏目ID,多个ID时用,号隔开</param>
/// </summary>
/// <returns>true or false</returns>
private bool IsHaveChild(string ParentIDFiled, string ClassID)
{
bool r = false;
if (ATableName.Select(ParentIDFiled + " in (" + ClassID + ") ").Length > 0)
{
r = true;
}
return r;
}