因某个朋友提出的Treeview操作数据库的问题,所以写了本节的代码。
本节代码使用的是command来操作的,主要原因:
1是绑定的灵活性不高
2是treeview似乎不能绑定数据,因为最终的数据是由TreeNode来显示的。
本节用到了罗斯文数据库中的产品表、类别表、供应商表。
设计界面如下:
左侧树状图列出类别和该类下的产品,根据选择的产品再将信息显示到右侧。
运行时如下图:
设计时需要考虑的问题:
二是窗口载入时显示出所有类别,使用 root1+类别ID 保存到Tag中。
三是为提高运行效率,在点击类别时检查是否下面有产品,如果没有产品,那么将产品加入到类别下,而不是载入窗体就加入产品到类别下。产品节点使用 root2+产品ID保存到所在节点。
四是点击树状图节点的时候,根据Tag中不同的前缀(root1还是root2)来执行不同操作。
主要代码如下:
加入窗体级变量:
Dim odc As OleDbConnection
窗体载入时,将所有类别名称加入到树状图:
Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load odc = New OleDbConnection() odc.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0;data source=D:\save\博客教程\08 数据库\Northwind.mdb" Dim sql As String = "select 类别id,类别名称 from 类别" Dim sqlCmd As New OleDbCommand(sql,odc) Dim odReader As OleDbDataReader odc.Open() Dim nd As TreeNode odReader = sqlCmd.ExecuteReader() If odReader.HasRows Then Do While odReader.Read nd = New TreeNode nd.Text = odReader(1) nd.Tag = "root1" & odReader(0) TreeView1.Nodes.Add(nd) Loop End If End Sub
点击树状图上面的节点:
Private Sub TreeView1_NodeMouseClick(sender As Object,e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick Dim nd As TreeNode nd = e.Node If nd.Tag.ToString.Substring(0,5) = "root1" Then Dim typeId As String = nd.Tag.ToString.Substring(5,1) If nd.Nodes.Count = 0 Then Dim sql As String = "select 产品Id,产品名称 from 产品 where 类别id=" & typeId Dim sqlCmd As New OleDbCommand(sql,odc) Dim odReader As OleDbDataReader odReader = sqlCmd.ExecuteReader() Dim childNode As TreeNode If odReader.HasRows Then Do While odReader.Read childNode = New TreeNode childNode.Text = odReader(1) childNode.Tag = "root2" & odReader(0) nd.Nodes.Add(childNode) Loop End If End If TreeView1.CollapseAll() nd.Expand() Else Dim childNodeTag As String = nd.Tag.ToString Dim productId As String = childNodeTag.Substring(5,childNodeTag.Length - 5) Dim sql As String = "SELECT a.*,b.类别名称,c.公司名称 FROM (产品 a inner join 类别 b on a.类别ID=b.类别ID) inner join 供应商 c on a.供应商ID=c.供应商ID where 产品id=" & productId Dim sqlCmd As New OleDbCommand(sql,odc) Dim odReader As OleDbDataReader odReader = sqlCmd.ExecuteReader(CommandBehavior.SingleRow) odReader.Read() TextBox1.Text = odReader("产品名称") TextBox2.Text = odReader("公司名称") TextBox3.Text = odReader("类别名称") TextBox4.Text = odReader("单位数量") TextBox5.Text = odReader("单价") TextBox6.Text = odReader("库存量") TextBox7.Text = odReader("订购量") TextBox8.Text = odReader("再订购量") TextBox9.Text = IIf(odReader("中止"),"是","否") End If End Sub
Private Sub Form1_Closing(sender As Object,e As CancelEventArgs) Handles Me.Closing odc.Close() End Sub
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录