首先是建立窗体Form和数据库登陆的信息输入窗口,之后在Form上面添加Treeview
然后每个节点都需要有自己的图标(不选和被选两种状态)
数据库服务器的登陆是通过SqlConnection进行实现的(略去)
下面的是Treeview的实现与初始化
通过realTreeView(TreeNode FNode, string byName, int depth)来实现
其中FNode是要进行添加子节点的父节点,对于根节点的建立要用null指定(注意此时的depth=0);
byName是传入的名字,根据depth其意义不同(depth=0:byName传入的是数据库服务器实例名, depth=1:byName传入的是某个数据库的名字)
然后定义两个const int常量
const short GETDBLISTBYSERVER = 1; const short GETTBLISTBYDBNAME = 2;
#region 实现TreeView
private void realTreeView(TreeNode FNode, string byName, int depth) // depth标示着深度,也用来描述图标
{
if (FNode == null) // 建立根节点
{
treeView1.ImageList = imageList1;
TreeNode tmpNode = new TreeNode();
tmpNode.Text = byName;
tmpNode.ImageIndex = 2*depth;
tmpNode.SelectedImageIndex = 2*depth+1;
treeView1.Nodes.Add(tmpNode);
realTreeView(tmpNode, tmpNode.Text, depth+1);
return;
}
List<string> ChNodes = getListByName(byName, depth);
if (ChNodes == null)
{
return;
}
// 下面是根据父节点FNode添加子节点
for (int i = 0; i < ChNodes.Count; ++i )
{
TreeNode tmpNode = new TreeNode();
tmpNode.Text = ChNodes[i];
tmpNode.ImageIndex = 2 * depth;
tmpNode.SelectedImageIndex = 2 * depth + 1;
FNode.Nodes.Add(tmpNode);
realTreeView(tmpNode, tmpNode.Text, depth + 1);
}
}
private List<string> getListByName(string byName, int depth)
{
List<string> retList = new List<string>();
if (depth == GETDBLISTBYSERVER)
{// 利用数据库服务器名字去获取数据库列表
string cmdString = "Select name from sysdatabases where sid <> 0x01";
SqlCommand sqlcmd = new SqlCommand(cmdString, connCloud);
try
{
if (connCloud.State == ConnectionState.Closed)
{
connCloud.Open();
}
IDataReader dr = sqlcmd.ExecuteReader();
retList.Clear();
while (dr.Read())
{
retList.Add(dr["name"].ToString());
}
dr.Close();
retList.Sort();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
if (depth == GETTBLISTBYDBNAME)
{// 利用数据库名称获取数据表列表
connCloud.ChangeDatabase(byName);
string strCMD = "SELECT Name FROM SysObjects Where XType='U' ORDER BY Name";
SqlCommand sqlCmd = new SqlCommand(strCMD, connCloud);
SqlDataReader dr = sqlCmd.ExecuteReader();
while (dr.Read())
{
retList.Add(dr["name"].ToString());
}
dr.Close();
retList.Sort();
}
else
{
retList = null;
}
return retList;
}
#endregion
通过这样的实现就可以完成单个数据库服务器实例上面的数据库以及数据表的TreeView显示.