Author:水如烟
三种情形示例
第一个示例,树情形。取MainForm主菜单的数据。ToolStripMenuItem本身是一个树。
随便在一个Form上加一些菜单。我的如图:
结果是:
代码:
Public
Class
FormTree
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection( Of Integer , MenuItemInformation)
mCollection.AppendFromBlankCodeNode(GetMenuNode( Me ))
Me .TreeView1.Nodes.Clear()
Me .TreeView1.Nodes.Add(mCollection.Node.ConvertToTreeNode( " Text " , True ))
Me .DataGridView1.DataSource = mCollection.Node.ConvertToDataTable( True )
End Sub
Private Function GetMenuNode( ByVal form As Form) As LzmTW.uSystem.uCollection.Node( Of MenuItemInformation)
If form.MainMenuStrip Is Nothing Then Return Nothing
Dim mNode As New LzmTW.uSystem.uCollection.Node( Of MenuItemInformation)( New MenuItemInformation)
mNode.Item.Name = " Root "
For Each item As ToolStripMenuItem In form.MainMenuStrip.Items
AppendNode(mNode, item)
Next
Return mNode
End Function
Private Sub AppendNode( ByVal node As LzmTW.uSystem.uCollection.Node( Of MenuItemInformation), ByVal menuItem As ToolStripMenuItem)
Dim mCurrentNode As LzmTW.uSystem.uCollection.Node( Of MenuItemInformation) = Nothing
mCurrentNode = node.Nodes.Add( New MenuItemInformation(menuItem))
For Each item As ToolStripMenuItem In menuItem.DropDownItems
AppendNode(mCurrentNode, item)
Next
End Sub
End Class
Public Class MenuItemInformation
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase( Of Integer )
Private gText As String
Public Property Text() As String
Get
Return gText
End Get
Set ( ByVal value As String )
gText = value
End Set
End Property
Sub New ()
End Sub
Sub New ( ByVal menuItem As ToolStripMenuItem)
With menuItem
Me .Name = .Name
Me .Text = .Text
End With
End Sub
End Class
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection( Of Integer , MenuItemInformation)
mCollection.AppendFromBlankCodeNode(GetMenuNode( Me ))
Me .TreeView1.Nodes.Clear()
Me .TreeView1.Nodes.Add(mCollection.Node.ConvertToTreeNode( " Text " , True ))
Me .DataGridView1.DataSource = mCollection.Node.ConvertToDataTable( True )
End Sub
Private Function GetMenuNode( ByVal form As Form) As LzmTW.uSystem.uCollection.Node( Of MenuItemInformation)
If form.MainMenuStrip Is Nothing Then Return Nothing
Dim mNode As New LzmTW.uSystem.uCollection.Node( Of MenuItemInformation)( New MenuItemInformation)
mNode.Item.Name = " Root "
For Each item As ToolStripMenuItem In form.MainMenuStrip.Items
AppendNode(mNode, item)
Next
Return mNode
End Function
Private Sub AppendNode( ByVal node As LzmTW.uSystem.uCollection.Node( Of MenuItemInformation), ByVal menuItem As ToolStripMenuItem)
Dim mCurrentNode As LzmTW.uSystem.uCollection.Node( Of MenuItemInformation) = Nothing
mCurrentNode = node.Nodes.Add( New MenuItemInformation(menuItem))
For Each item As ToolStripMenuItem In menuItem.DropDownItems
AppendNode(mCurrentNode, item)
Next
End Sub
End Class
Public Class MenuItemInformation
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase( Of Integer )
Private gText As String
Public Property Text() As String
Get
Return gText
End Get
Set ( ByVal value As String )
gText = value
End Set
End Property
Sub New ()
End Sub
Sub New ( ByVal menuItem As ToolStripMenuItem)
With menuItem
Me .Name = .Name
Me .Text = .Text
End With
End Sub
End Class
第二个示例,(Code,Name)情形。仍以行政区划数据为例。
代码:
Public
Class
Form1
Public gRegionalDatas As DataTable ' 这是列为Code,Name的行政区划数据表
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection( Of String , RegionalCodeItem)( " 00,00,00 " )
For Each row As DataRow In gRegionalDatas.Rows
With row
mCollection.Add(.Item( " Code " ).ToString, .Item( " Name " ).ToString)
End With
Next
Me .TreeView1.Nodes.Clear()
Me .TreeView1.Nodes.Add(mCollection.Node.ConvertToTreeNode( " Name " , True ))
Me .DataGridView1.DataSource = mCollection.Node.ConvertToDataTable( True )
End Sub
End Class
Public Class RegionalCodeItem
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase( Of String )
Sub New ()
End Sub
Sub New ( ByVal code As String , ByVal name As String )
MyBase .New(code, name)
End Sub
End Class
Public gRegionalDatas As DataTable ' 这是列为Code,Name的行政区划数据表
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection( Of String , RegionalCodeItem)( " 00,00,00 " )
For Each row As DataRow In gRegionalDatas.Rows
With row
mCollection.Add(.Item( " Code " ).ToString, .Item( " Name " ).ToString)
End With
Next
Me .TreeView1.Nodes.Clear()
Me .TreeView1.Nodes.Add(mCollection.Node.ConvertToTreeNode( " Name " , True ))
Me .DataGridView1.DataSource = mCollection.Node.ConvertToDataTable( True )
End Sub
End Class
Public Class RegionalCodeItem
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase( Of String )
Sub New ()
End Sub
Sub New ( ByVal code As String , ByVal name As String )
MyBase .New(code, name)
End Sub
End Class
效果:
第三个示例,自联表数据情形。这里以树和自联表(四) 上的数据为例。
要使用本示例代码,需把以上数据存为一个Excel文件,文件名为Menus.xls,数据簿工作表名称为Menus。存它到程序运行目录上。
首先把数据读进一个DataTable里面。
Private
Sub
Button2_Click(
ByVal
sender
As
System.Object,
ByVal
e
As
System.EventArgs)
Handles
Button2.Click
Dim cn As New Odbc.OdbcConnection( " Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=menus.xls;HDR=Yes; " )
Dim cm As New Odbc.OdbcCommand( " SELECT * FROM [Menus$] " , cn)
Dim ad As New Odbc.OdbcDataAdapter(cm)
Dim mds As New DataSet( " Menus " )
ad.Fill(mds, " Menu " )
mds.WriteXmlSchema( " Menus.xsd " )
mds.WriteXml( " menus.xml " )
Me .DataGridView1.DataSource = mds.Tables( 0 )
End Sub
Dim cn As New Odbc.OdbcConnection( " Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=menus.xls;HDR=Yes; " )
Dim cm As New Odbc.OdbcCommand( " SELECT * FROM [Menus$] " , cn)
Dim ad As New Odbc.OdbcDataAdapter(cm)
Dim mds As New DataSet( " Menus " )
ad.Fill(mds, " Menu " )
mds.WriteXmlSchema( " Menus.xsd " )
mds.WriteXml( " menus.xml " )
Me .DataGridView1.DataSource = mds.Tables( 0 )
End Sub
由于我没有预建一个DataTable,所以上面代码运行后它自动的将Integer类型作为Double类型来处理。因此,需把它转为Intege类型。在此,我将数据存为xml形式,同时输出Schema文件。
之后,打开Menus.xsd文件,将所有Double类型改为Integer类型,保存。
现在可以使用这些数据了:
<
Serializable()
>
_
Public Class MenuItem
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase( Of Integer )
Private gText As String
Private gDeclare As String
Private gToolTipText As String
Private gShortcut As Integer
Private gClickAction As String
Private gVisible As Boolean
Private gEnabled As Boolean
Public Property Text() As String
Get
Return gText
End Get
Set ( ByVal value As String )
gText = value
End Set
End Property
Public Property [ Declare ]() As String
Get
Return gDeclare
End Get
Set ( ByVal value As String )
gDeclare = value
End Set
End Property
Public Property ToolTipText() As String
Get
Return gToolTipText
End Get
Set ( ByVal value As String )
gToolTipText = value
End Set
End Property
Public Property Shortcut() As Integer
Get
Return gShortcut
End Get
Set ( ByVal value As Integer )
gShortcut = value
End Set
End Property
Public Property ClickAction() As String
Get
Return gClickAction
End Get
Set ( ByVal value As String )
gClickAction = value
End Set
End Property
Public Property Visible() As Boolean
Get
Return gVisible
End Get
Set ( ByVal value As Boolean )
gVisible = value
End Set
End Property
Public Property Enabled() As Boolean
Get
Return gEnabled
End Get
Set ( ByVal value As Boolean )
gEnabled = value
End Set
End Property
End Class
Public Class MenuItem
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase( Of Integer )
Private gText As String
Private gDeclare As String
Private gToolTipText As String
Private gShortcut As Integer
Private gClickAction As String
Private gVisible As Boolean
Private gEnabled As Boolean
Public Property Text() As String
Get
Return gText
End Get
Set ( ByVal value As String )
gText = value
End Set
End Property
Public Property [ Declare ]() As String
Get
Return gDeclare
End Get
Set ( ByVal value As String )
gDeclare = value
End Set
End Property
Public Property ToolTipText() As String
Get
Return gToolTipText
End Get
Set ( ByVal value As String )
gToolTipText = value
End Set
End Property
Public Property Shortcut() As Integer
Get
Return gShortcut
End Get
Set ( ByVal value As Integer )
gShortcut = value
End Set
End Property
Public Property ClickAction() As String
Get
Return gClickAction
End Get
Set ( ByVal value As String )
gClickAction = value
End Set
End Property
Public Property Visible() As Boolean
Get
Return gVisible
End Get
Set ( ByVal value As Boolean )
gVisible = value
End Set
End Property
Public Property Enabled() As Boolean
Get
Return gEnabled
End Get
Set ( ByVal value As Boolean )
gEnabled = value
End Set
End Property
End Class
Private
Sub
Button1_Click(
ByVal
sender
As
System.Object,
ByVal
e
As
System.EventArgs)
Handles
Button1.Click
Dim ds As New DataSet
ds.ReadXmlSchema( " Menus.xsd " )
ds.ReadXml( " Menus.xml " )
Dim mCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection( Of Integer , MenuItem)
' mCollection.Read()
mCollection.AppendFromSinceLinkTable(ds.Tables( 0 ))
' mCollection.Save()
Me .DataGridView1.DataSource = mCollection.Node.ConvertToDataTable( True )
Me .TreeView1.Nodes.Clear()
Me .TreeView1.Nodes.Add(mCollection.Node.ConvertToTreeNode( " Declare " , True ))
' Console.WriteLine(mCollection.Node.FindFirstNode("Code", "300").Item.Text)
' Console.WriteLine(mCollection.Find("Code", "300").Text)
End Sub
Dim ds As New DataSet
ds.ReadXmlSchema( " Menus.xsd " )
ds.ReadXml( " Menus.xml " )
Dim mCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection( Of Integer , MenuItem)
' mCollection.Read()
mCollection.AppendFromSinceLinkTable(ds.Tables( 0 ))
' mCollection.Save()
Me .DataGridView1.DataSource = mCollection.Node.ConvertToDataTable( True )
Me .TreeView1.Nodes.Clear()
Me .TreeView1.Nodes.Add(mCollection.Node.ConvertToTreeNode( " Declare " , True ))
' Console.WriteLine(mCollection.Node.FindFirstNode("Code", "300").Item.Text)
' Console.WriteLine(mCollection.Find("Code", "300").Text)
End Sub
结果:
用这种方法,处理以上三种通常用到的数据,还是比较方便的。