近日,因为工作需要用到了TreeView。因为分不够,用了个马甲发了个问题并对坛子里面一位大牛产生了些分歧。在此表示歉意。
说下TreeView,存到数据库,并保存结构;然后从数据库中取出来。下面把代码贴出来。请大家看看并指正出缺点。可以运行。呵呵。数据库设计。NodeID(节点编号),NodeName(节点名称),NodeParentID(父节点编号)
首先存入数据库:
public void SaveTemplateStruct(TreeNodeCollection tc)
{
conn.Open();
string strNodeName = "";
foreach (TreeNode TNode in tc)
{
if (TNode.Parent == null)
{
iNodeID = TNode.Index;
iParentID = -1;
strNodeName = TNode.Text.ToString();
strNodeParentName = "00";
iNodeIndex = 0;
TNode.Tag = iNodeIndex;
iNodeParentIndex = -1; }
else
{
iNodeID++;
strNodeName = TNode.Text.ToString();
strNodeParentName = TNode.Parent.Text.ToString();
if (TNode.Parent.Tag != null)
{
iNodeParentIndex = Convert.ToInt32(TNode.Parent.Tag); }
TNode.Tag = iNodeID;
iNodeIndex = TNode.Index;
}
string sql = "insert into template_struct (serial_number,serial_name,serial_parent_number) values (" + iNodeID + ", '" + strNodeName + "'," + iNodeParentIndex + ")";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
SaveTemplateStruct(TNode.Nodes);
}
}
数据库中读取出来:private void AddTree()
{
ds.Clear();
tvTemplateList.Nodes.Clear();
SqlDataAdapter da = new SqlDataAdapter("select * from template_struct order by serial_number", conn);
da.Fill(ds, "tree");
if (ds.Tables["tree"].Rows.Count > 0)
{
tvTemplateList.Nodes.Clear();
foreach (DataRow dr in ds.Tables["tree"].Rows)
{
if ((int.Parse(dr["serial_number"].ToString()) == 0) && (int.Parse(dr["serial_parent_number"].ToString()) == -1))
{
TreeNode tr = new TreeNode();
tr.Text = dr[2].ToString();
tr.Tag = dr["serial_number"].ToString();
tvTemplateList.Nodes.Add(tr); }
}
if (tvTemplateList.Nodes.Count > 0)
{
AddRoot(tvTemplateList.Nodes[0], ds);
}
}
else
{
MessageBox.Show("warning");
}
}
private void AddRoot(TreeNode tr, DataSet ds)
{
foreach (DataRow dr in ds.Tables["tree"].Rows)
{ if (dr[3].ToString() == tr.Tag.ToString())
{
TreeNode tr1 = new TreeNode();
tr1.Text = dr[2].ToString();
tr.Nodes.Add(tr1);
tr1.Tag = dr["serial_number"].ToString();
AddRoot(tr1, ds);
} }
}
说下TreeView,存到数据库,并保存结构;然后从数据库中取出来。下面把代码贴出来。请大家看看并指正出缺点。可以运行。呵呵。数据库设计。NodeID(节点编号),NodeName(节点名称),NodeParentID(父节点编号)
首先存入数据库:
public void SaveTemplateStruct(TreeNodeCollection tc)
{
conn.Open();
string strNodeName = "";
foreach (TreeNode TNode in tc)
{
if (TNode.Parent == null)
{
iNodeID = TNode.Index;
iParentID = -1;
strNodeName = TNode.Text.ToString();
strNodeParentName = "00";
iNodeIndex = 0;
TNode.Tag = iNodeIndex;
iNodeParentIndex = -1; }
else
{
iNodeID++;
strNodeName = TNode.Text.ToString();
strNodeParentName = TNode.Parent.Text.ToString();
if (TNode.Parent.Tag != null)
{
iNodeParentIndex = Convert.ToInt32(TNode.Parent.Tag); }
TNode.Tag = iNodeID;
iNodeIndex = TNode.Index;
}
string sql = "insert into template_struct (serial_number,serial_name,serial_parent_number) values (" + iNodeID + ", '" + strNodeName + "'," + iNodeParentIndex + ")";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
SaveTemplateStruct(TNode.Nodes);
}
}
数据库中读取出来:private void AddTree()
{
ds.Clear();
tvTemplateList.Nodes.Clear();
SqlDataAdapter da = new SqlDataAdapter("select * from template_struct order by serial_number", conn);
da.Fill(ds, "tree");
if (ds.Tables["tree"].Rows.Count > 0)
{
tvTemplateList.Nodes.Clear();
foreach (DataRow dr in ds.Tables["tree"].Rows)
{
if ((int.Parse(dr["serial_number"].ToString()) == 0) && (int.Parse(dr["serial_parent_number"].ToString()) == -1))
{
TreeNode tr = new TreeNode();
tr.Text = dr[2].ToString();
tr.Tag = dr["serial_number"].ToString();
tvTemplateList.Nodes.Add(tr); }
}
if (tvTemplateList.Nodes.Count > 0)
{
AddRoot(tvTemplateList.Nodes[0], ds);
}
}
else
{
MessageBox.Show("warning");
}
}
private void AddRoot(TreeNode tr, DataSet ds)
{
foreach (DataRow dr in ds.Tables["tree"].Rows)
{ if (dr[3].ToString() == tr.Tag.ToString())
{
TreeNode tr1 = new TreeNode();
tr1.Text = dr[2].ToString();
tr.Nodes.Add(tr1);
tr1.Tag = dr["serial_number"].ToString();
AddRoot(tr1, ds);
} }
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货