树和自联表的详细介绍

树和自联表的详细介绍

Author:水如烟

三种情形示例

第一个示例,树情形。取MainForm主菜单的数据。ToolStripMenuItem本身是一个树。

随便在一个Form上加一些菜单。我的如图:

树和自联表的详细介绍

树和自联表的详细介绍

结果是:

树和自联表的详细介绍

代码:

PublicClassFormTree

PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
DimmCollectionAsNewLzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection(OfInteger,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)
EndSub

PrivateFunctionGetMenuNode(ByValformAsForm)AsLzmTW.uSystem.uCollection.Node(OfMenuItemInformation)
Ifform.MainMenuStripIsNothingThenReturnNothing
DimmNodeAsNewLzmTW.uSystem.uCollection.Node(OfMenuItemInformation)(NewMenuItemInformation)
mNode.Item.Name
="Root"

ForEachitemAsToolStripMenuItemInform.MainMenuStrip.Items
AppendNode(mNode,item)

Next

ReturnmNode
EndFunction

PrivateSubAppendNode(ByValnodeAsLzmTW.uSystem.uCollection.Node(OfMenuItemInformation),ByValmenuItemAsToolStripMenuItem)
DimmCurrentNodeAsLzmTW.uSystem.uCollection.Node(OfMenuItemInformation)=Nothing
mCurrentNode=node.Nodes.Add(NewMenuItemInformation(menuItem))

ForEachitemAsToolStripMenuItemInmenuItem.DropDownItems
AppendNode(mCurrentNode,item)

Next

EndSub
EndClass

PublicClassMenuItemInformation
InheritsLzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase(OfInteger)

PrivategTextAsString
PublicPropertyText()AsString
Get
ReturngText
EndGet
Set(ByValvalueAsString)
gText
=value
EndSet
EndProperty

SubNew()
EndSub

SubNew(ByValmenuItemAsToolStripMenuItem)
WithmenuItem
Me.Name=.Name
Me.Text=.Text
EndWith
EndSub

EndClass

第二个示例,(Code,Name)情形。仍以行政区划数据为例。

代码:

PublicClassForm1


PublicgRegionalDatasAsDataTable'这是列为Code,Name的行政区划数据表

PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click

DimmCollectionAsNewLzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection(OfString,RegionalCodeItem)("00,00,00")

ForEachrowAsDataRowIngRegionalDatas.Rows
Withrow
mCollection.Add(.Item(
"Code").ToString,.Item("Name").ToString)
EndWith
Next

Me.TreeView1.Nodes.Clear()
Me.TreeView1.Nodes.Add(mCollection.Node.ConvertToTreeNode("Name",True))

Me.DataGridView1.DataSource=mCollection.Node.ConvertToDataTable(True)
EndSub

EndClass

PublicClassRegionalCodeItem
InheritsLzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase(OfString)

SubNew()
EndSub

SubNew(ByValcodeAsString,ByValnameAsString)
MyBase.New(code,name)
EndSub

EndClass

效果:

树和自联表的详细介绍

第三个示例,自联表数据情形。这里以树和自联表(四) 上的数据为例。

要使用本示例代码,需把以上数据存为一个Excel文件,文件名为Menus.xls,数据簿工作表名称为Menus。存它到程序运行目录上。

首先把数据读进一个DataTable里面。

PrivateSubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.Click
DimcnAsNewOdbc.OdbcConnection("Driver={MicrosoftExcelDriver(*.xls)};DriverId=790;Dbq=menus.xls;HDR=Yes;")
DimcmAsNewOdbc.OdbcCommand("SELECT*FROM[Menus$]",cn)
DimadAsNewOdbc.OdbcDataAdapter(cm)
DimmdsAsNewDataSet("Menus")
ad.Fill(mds,
"Menu")
mds.WriteXmlSchema(
"Menus.xsd")
mds.WriteXml(
"menus.xml")
Me.DataGridView1.DataSource=mds.Tables(0)
EndSub

由于我没有预建一个DataTable,所以上面代码运行后它自动的将Integer类型作为Double类型来处理。因此,需把它转为Intege类型。在此,我将数据存为xml形式,同时输出Schema文件。

之后,打开Menus.xsd文件,将所有Double类型改为Integer类型,保存。

现在可以使用这些数据了:

<Serializable()>_
PublicClassMenuItem
InheritsLzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase(OfInteger)

PrivategTextAsString
PrivategDeclareAsString
PrivategToolTipTextAsString
PrivategShortcutAsInteger
PrivategClickActionAsString
PrivategVisibleAsBoolean
PrivategEnabledAsBoolean

PublicPropertyText()AsString
Get
ReturngText
EndGet
Set(ByValvalueAsString)
gText
=value
EndSet
EndProperty

PublicProperty[Declare]()AsString
Get
ReturngDeclare
EndGet
Set(ByValvalueAsString)
gDeclare
=value
EndSet
EndProperty

PublicPropertyToolTipText()AsString
Get
ReturngToolTipText
EndGet
Set(ByValvalueAsString)
gToolTipText
=value
EndSet
EndProperty

PublicPropertyShortcut()AsInteger
Get
ReturngShortcut
EndGet
Set(ByValvalueAsInteger)
gShortcut
=value
EndSet
EndProperty

PublicPropertyClickAction()AsString
Get
ReturngClickAction
EndGet
Set(ByValvalueAsString)
gClickAction
=value
EndSet
EndProperty

PublicPropertyVisible()AsBoolean
Get
ReturngVisible
EndGet
Set(ByValvalueAsBoolean)
gVisible
=value
EndSet
EndProperty

PublicPropertyEnabled()AsBoolean
Get
ReturngEnabled
EndGet
Set(ByValvalueAsBoolean)
gEnabled
=value
EndSet
EndProperty
EndClass
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
DimdsAsNewDataSet
ds.ReadXmlSchema(
"Menus.xsd")
ds.ReadXml(
"Menus.xml")

DimmCollectionAsNewLzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection(OfInteger,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)
EndSub

结果:

树和自联表的详细介绍

用这种方法,处理以上三种通常用到的数据,还是比较方便的。