嘿,我得到了一些代码,可以从XML文件中摘取信息并将其返回为字符串。IM试图弄清楚如何将XML文件中的所有模块名称放在每个生成的盒子中都有预选图像的图像框。这是我拥有的代码。
Imports System.Xml
Imports System.Xml.Linq
Imports System.IO
Public Class Form1
Public FILENAME As String = String.Empty
Public models As Model
Public productionBlocks As New Panel
Public pictureBlocks As New List(Of PictureBox)
Public gridsinfo As CubeGrid
Public dictCount As New Dictionary(Of String, Integer)
Public dictionay As New Dictionary(Of String, String)
Public fileloader As New OpenFileDialog
Dim NUMBER_OF_PANELS = 0
Const MAIN_PANEL_WIDTH As Integer = 1000
Const MAIN_PANEL_HEIGHT As Integer = 1000
Const MAIN_PANEL_TOP As Integer = 50
Const MAIN_PANEL_LEFT As Integer = 50
Const PANEL_COLUMNS As Integer = 5
Const PANEL_WIDTH_MARGIN As Integer = 10
Const PANEL_HEIGHT_MARGIN As Integer = 10
Const PANEL_WIDTH As Integer = (MAIN_PANEL_WIDTH / PANEL_COLUMNS) - PANEL_WIDTH_MARGIN
Dim PANEL_ROWS As Integer = 0
Dim PANEL_HEIGHT As Integer = 0
Dim PICTURE_BOX_MARGIN As Integer = 0
Dim PICTURE_BOX_WIDTH As Integer = PANEL_WIDTH
Dim PICTURE_BOX_HEIGHT As Integer = 0
Const PICTURE_BOX_TOP As Integer = 0
Const PICTURE_BOX_LEFT As Integer = 0
Dim LABEL_WIDTH As Integer = PANEL_WIDTH
Dim LABEL_HEIGHT As Integer = 0
Dim LABEL_TOP As Integer = 0
Dim LABEL_LEFT As Int16 = 0
Dim IMAGE_PATH As String = "E:VS ProjectsResourcesSECubesArmorCenter.jpg"
Public _model As Model
Public mainPanel As New CubeGrid
Public subPanels As New List(Of CubeBlock)
Sub New()
' This call is required by the designer.
InitializeComponent()
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
End Sub
Sub CalulateControlSizes(numberOfPanels As Integer)
PANEL_ROWS = Math.Ceiling(NUMBER_OF_PANELS / PANEL_COLUMNS)
'PANEL_HEIGHT = (MAIN_PANEL_HEIGHT / PANEL_ROWS) - PANEL_HEIGHT_MARGIN
PANEL_HEIGHT = 200
PICTURE_BOX_MARGIN = 0.1 * PANEL_HEIGHT
PICTURE_BOX_HEIGHT = 0.8 * PANEL_HEIGHT
LABEL_HEIGHT = 0.1 * PANEL_HEIGHT
LABEL_TOP = PICTURE_BOX_HEIGHT + PANEL_HEIGHT_MARGIN
End Sub
'FindWords Function to get count of items
Private Function FindWords(ByVal TextSearched As String, ByVal Paragraph As String) As Integer
Dim location As Integer = 0
Dim occurances As Integer = 0
Do
location = TextSearched.IndexOf(Paragraph, location)
If location <> -1 Then
occurances += 1
location += Paragraph.Length
End If
Loop Until location = -1
Return occurances
End Function
'Open Button
Private Sub PictureBox1_MouseEnter(sender As Object, e As EventArgs) Handles PictureBox1.MouseEnter
PictureBox1.BorderStyle = BorderStyle.Fixed3D
End Sub
Private Sub PictureBox1_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox1.MouseLeave
PictureBox1.BorderStyle = BorderStyle.FixedSingle
End Sub
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
'Resetting the list box when new file is loaded
Try
For Each item In ListBox1.Items
ListBox1.Items.Remove(item)
Next
Catch ex As Exception
End Try
'pre-load initialization
fileloader.ShowDialog()
FILENAME = fileloader.FileName
models = New Model
models.Load(FILENAME)
'Grabbing information from XML file
Dim blockNames As List(Of String) = models.print.Select(Function(x) x.cubes.Select(Function(y) y.cubeBlocks.Select(Function(z) z.SubtypeName)).SelectMany(Function(y) y).ToList()).FirstOrDefault()
dictCount = blockNames.GroupBy(Function(x) x).ToDictionary(Function(x) x.Key, Function(y) y.Count)
Dim display As String = models.print2.Select(Function(x) x.cubes.Select(Function(y) y.displayname)).SelectMany(Function(y) y).FirstOrDefault.ToString
Dim gridsizeenum As String = models.print3.Select(Function(x) x.cubes.Select(Function(y) y.enumerator)).SelectMany(Function(y) y).FirstOrDefault.ToString
'Dim ownername As String = models.print4.Select(Function(x) x.cubes.Select(Function(y) y.ownername)).SelectMany(Function(y) y).FirstOrDefault.ToString
'Load items into the listbox
For Each item In dictCount
ListBox1.Items.Add(item.ToString)
Next item
'a useless dictionary method [UN-USED]
For Each key As String In dictCount.Keys.AsEnumerable()
Dim keylist As String = "subTypeName = '{0}', count = '{1}'" + key.ToString + dictCount(key).ToString
Next key
'Load Text from XML to the read only boxes
InfluenceTextBox2.Text = "Grid Name: " + display.ToString
InfluenceTextBox3.Text = "Grid Type: " + gridsizeenum.ToString + " Ship"
'InfluenceTextBox1.Text = "Owner Name: " + ownername.ToString
'Gui Displaying
Dim reader As New StreamReader(FILENAME)
Dim doc As XDocument = XDocument.Load(reader)
Dim xmlstring As String = doc.ToString
LightArmorBlockText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorBlock").ToString
LightArmorSlopeText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorSlope").ToString
LightArmorCornerText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorCorner").ToString
LightArmorCornerInvertedText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorInvCorner").ToString
'Function to calculate oxygentanks and hydrogen tanks
Dim tanks As Integer = FindWords(xmlstring, "MyObjectBuilder_OxygenTank").ToString
Dim oxygentanks As Integer = tanks - FindWords(xmlstring, "LargeHydrogenTank").ToString
OxygenTanksText.Text = "Qty: " + oxygentanks.ToString
HydrogenTanksText.Text = "Qty: " + FindWords(xmlstring, "LargeHydrogenTank").ToString
dictionay = blockNames.GroupBy(Function(x) x).ToDictionary(Function(x) x.Key, Function(y) y.Key)
'Procedural Control Generation
_model = New Model()
_model.Load(FILENAME)
NUMBER_OF_PANELS = _model.print.cubes(0).cubeBlocks.Count
CalulateControlSizes(NUMBER_OF_PANELS)
mainPanel = _model.print.cubes(0)
mainPanel.Height = MAIN_PANEL_HEIGHT
mainPanel.Width = MAIN_PANEL_WIDTH
mainPanel.Top = MAIN_PANEL_TOP
mainPanel.Left = MAIN_PANEL_LEFT
mainPanel.BackColor = Color.FromArgb(24, 24, 24)
mainPanel.ForeColor = Color.White
mainPanel.AutoScroll = True
mainPanel.VerticalScroll.Visible = True
mainPanel.HorizontalScroll.Visible = True
Me.Controls.Add(mainPanel)
For panelNumber As Integer = 0 To (NUMBER_OF_PANELS - 1)
Dim row As Integer = Math.Floor(panelNumber / PANEL_COLUMNS)
Dim col As Integer = panelNumber Mod PANEL_COLUMNS
Dim newPanel As CubeBlock = _model.print.cubes(0).cubeBlocks(panelNumber)
newPanel.Top = row * (PANEL_HEIGHT + PANEL_HEIGHT_MARGIN)
newPanel.Left = col * (PANEL_WIDTH + PANEL_WIDTH_MARGIN)
newPanel.Width = PANEL_WIDTH
newPanel.Height = PANEL_HEIGHT
newPanel.BackColor = Color.FromArgb(24, 24, 24)
newPanel.ForeColor = Color.White
mainPanel.Controls.Add(newPanel)
subPanels.Add(newPanel)
Dim newPicture As New PictureBox()
newPicture.Height = PICTURE_BOX_HEIGHT
newPicture.Width = PICTURE_BOX_WIDTH
newPicture.Top = PICTURE_BOX_TOP
newPicture.Left = PICTURE_BOX_LEFT
newPicture.Image = Image.FromFile(IMAGE_PATH)
newPicture.BackColor = Color.FromArgb(24, 24, 24)
newPanel.Controls.Add(newPicture)
Dim newLabel As New Label
newLabel.Height = LABEL_HEIGHT
newLabel.Width = LABEL_WIDTH
newLabel.Top = LABEL_TOP
newLabel.Left = LABEL_LEFT
newLabel.BackColor = Color.Transparent
newLabel.ForeColor = Color.White
newLabel.Text = newPanel.SubtypeName & "(" & newPanel.count & ")"
newLabel.BackColor = SystemColors.Window
newLabel.ForeColor = SystemColors.WindowText
newPanel.Controls.Add(newLabel)
Next panelNumber
End Sub
'END OPEN BUTTON
'Contributors Section
Private Sub InfluenceTopButton1_Click(sender As Object, e As EventArgs) Handles InfluenceTopButton1.Click
Form2.Show()
End Sub
'XML INPUT LOADING FUNCTION
End Class
Public Class Model
Public print As New List(Of Model)
Public print2 As New List(Of Model)
Public print3 As New List(Of Model)
Public print4 As New List(Of Model)
Public _type As String
Public _id As ID
Public _display As String
Public _display1 As String
Public displayname As String
Public enumerator As String
Public cubes As List(Of CubeGrid)
Public info As String
Public Sub Load(filename As String)
Dim reader As New StreamReader(filename)
Dim doc As XDocument = XDocument.Load(reader)
Dim firstNode As XElement = doc.FirstNode
Dim xsiNs = firstNode.GetNamespaceOfPrefix("xsi")
Dim drawingTypes = firstNode.Elements.FirstOrDefault()
Dim drawingType = drawingTypes.Elements.FirstOrDefault()
Dim drawingStr = drawingType.Name.LocalName
print = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
._type = x.Attribute(xsiNs + "type"), ._id = x.Elements("Id").Select(Function(y) New ID() With {
.type = y.Attribute("Type"),
.subtype = y.Attribute("Subtype")
}).FirstOrDefault(),
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.id = y.Element("EntityId"),
.persistentFlags = y.Element("PersistentFlags"),
.position = y.Descendants("Position").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.forward = y.Descendants("Forward").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.up = y.Descendants("Up").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.orientation = y.Descendants("Orientation").Select(Function(z) New location() With {
.w = CType(z.Element("W"), Double),
.x = CType(z.Element("X"), Double),
.y = CType(z.Element("Y"), Double),
.z = CType(z.Element("Z"), Double)
}).FirstOrDefault(),
.cubeBlocks = y.Descendants("MyObjectBuilder_CubeBlock").GroupBy(Function(z) CType(z.Element("SubtypeName"), String)).Select(Function(z) New CubeBlock() With {
.SubtypeName = z.Key,
.count = z.Count
}).OrderBy(Function(z) z.SubtypeName).ToList()
}).ToList()
}).ToList()
print2 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.displayname = y.Element("DisplayName")
}).ToList()
}).ToList()
print3 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.enumerator = y.Element("GridSizeEnum")
}).ToList()
}).ToList()
'Not Working - Gets owner name
print4 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("MyObjectBuilder_ShipBlueprintDefinition").Select(Function(y) New CubeGrid() With {
.ownername = y.Element("DisplayName")
}).ToList()
}).ToList()
End Sub
End Class
Public Class ID
Public type As String
Public subtype As String
End Class
Public Class CubeGrid
Inherits Panel
Public id As String
Public persistentFlags As String
Public position As location
Public forward As location
Public up As location
Public orientation As location
Public cubeBlocks As List(Of CubeBlock)
Public displayname As String
Public ownername As String
Public enumerator As String
End Class
Public Class location
Public w As Double
Public x As Double
Public y As Double
Public z As Double
End Class
Public Class CubeBlock
Inherits Panel
Public SubtypeName As String
Public username As String
Public count As Integer
End Class
使用块名中的每个项目创建一个图片框和它下面的文本框&lt;https://i.stack.imgur.com/cqp9t.jpg>用于参考。
使用这两个生成的项目作为子控制创建自定义控件:
'Procedural Control Generation
For Each item In dictCount
For panelNumber As Integer = 0 To (NUMBER_OF_PANELS - 1)
Dim row As Integer = Math.Floor(panelNumber / PANEL_COLUMNS)
Dim col As Integer = panelNumber Mod PANEL_COLUMNS
Dim newPanel As New Panel
newPanel.Top = row * (PANEL_HEIGHT + PANEL_HEIGHT_MARGIN)
newPanel.Left = col * (PANEL_WIDTH + PANEL_WIDTH_MARGIN)
newPanel.Width = PANEL_WIDTH
newPanel.Height = PANEL_HEIGHT
mainPanel.Controls.Add(newPanel)
subPanels.Add(newPanel)
Dim newTextBox As New TextImagePanelLibrary.TextImagePanel
newTextBox.BackgroundImage = My.Resources.heavy_armor_cube
newTextBox.BackgroundImageLayout = ImageLayout.Stretch
newTextBox.Height = 100
newTextBox.Width = 100
newTextBox.Top = TEXT_BOX_TOP
newTextBox.Left = TEXT_BOX_LEFT
newTextBox.Text = "Qty: " + item.ToString
FlowLayoutPanel1.Controls.Add(newTextBox)
Next panelNumber
Next item
使用每个项目功能项中的信息是包含块名称和计数
我从您的代码中删除了语法错误,并简化了查询的SOOME。
Imports System.Xml
Imports System.Xml.Linq
Imports System.IO
Public Class Form1
Public FILENAME As String = String.Empty
Public models As Model
Public productionBlocks As New Panel
Public pictureBlocks As New List(Of PictureBox)
Public gridsinfo As CubeGrid
Public dictCount As New Dictionary(Of String, Integer)
Public dictionay As New Dictionary(Of String, String)
Public fileloader As New OpenFileDialog
Dim NUMBER_OF_PANELS = 0
Const MAIN_PANEL_WIDTH As Integer = 1000
Const MAIN_PANEL_HEIGHT As Integer = 1000
Const MAIN_PANEL_TOP As Integer = 50
Const MAIN_PANEL_LEFT As Integer = 50
Const PANEL_COLUMNS As Integer = 5
Const PANEL_WIDTH_MARGIN As Integer = 10
Const PANEL_HEIGHT_MARGIN As Integer = 10
Const PANEL_WIDTH As Integer = (MAIN_PANEL_WIDTH / PANEL_COLUMNS) - PANEL_WIDTH_MARGIN
Dim PANEL_ROWS As Integer = 0
Dim PANEL_HEIGHT As Integer = 0
Dim PICTURE_BOX_MARGIN As Integer = 0
Dim PICTURE_BOX_WIDTH As Integer = PANEL_WIDTH
Dim PICTURE_BOX_HEIGHT As Integer = 0
Const PICTURE_BOX_TOP As Integer = 0
Const PICTURE_BOX_LEFT As Integer = 0
Dim LABEL_WIDTH As Integer = PANEL_WIDTH
Dim LABEL_HEIGHT As Integer = 0
Dim LABEL_TOP As Integer = 0
Dim LABEL_LEFT As Int16 = 0
Dim IMAGE_PATH As String = "c:tempimage1.jpg"
Public _model As Model
Public mainPanel As New CubeGrid
Public subPanels As New List(Of CubeBlock)
Sub New()
' This call is required by the designer.
InitializeComponent()
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
End Sub
Sub CalulateControlSizes(numberOfPanels As Integer)
PANEL_ROWS = Math.Ceiling(NUMBER_OF_PANELS / PANEL_COLUMNS)
'PANEL_HEIGHT = (MAIN_PANEL_HEIGHT / PANEL_ROWS) - PANEL_HEIGHT_MARGIN
PANEL_HEIGHT = 200
PICTURE_BOX_MARGIN = 0.1 * PANEL_HEIGHT
PICTURE_BOX_HEIGHT = 0.8 * PANEL_HEIGHT
LABEL_HEIGHT = 0.1 * PANEL_HEIGHT
LABEL_TOP = PICTURE_BOX_HEIGHT + PANEL_HEIGHT_MARGIN
End Sub
'FindWords Function to get count of items
Private Function FindWords(ByVal TextSearched As String, ByVal Paragraph As String) As Integer
Dim location As Integer = 0
Dim occurances As Integer = 0
Do
location = TextSearched.IndexOf(Paragraph, location)
If location <> -1 Then
occurances += 1
location += Paragraph.Length
End If
Loop Until location = -1
Return occurances
End Function
'Open Button
Private Sub PictureBox1_MouseEnter(sender As System.Object, e As EventArgs) Handles PictureBox1.MouseEnter
PictureBox1.BorderStyle = BorderStyle.Fixed3D
End Sub
Private Sub PictureBox1_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox1.MouseLeave
PictureBox1.BorderStyle = BorderStyle.FixedSingle
End Sub
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
'Resetting the list box when new file is loaded
Try
For Each item In ListBox1.Items
ListBox1.Items.Remove(item)
Next
Catch ex As Exception
End Try
'pre-load initialization
fileloader.ShowDialog()
FILENAME = fileloader.FileName
models = New Model
models.Load(FILENAME)
'Grabbing information from XML file
Dim blockNames As List(Of String) = models.print.cubes.cubeBlocks.Select(Function(x) x.SubtypeName).ToList()
dictCount = blockNames.GroupBy(Function(x) x).ToDictionary(Function(x) x.Key, Function(y) y.Count)
Dim display As String = models.print2.cubes.displayname
Dim gridsizeenum As String = models.print3.cubes.enumerator
'Dim ownername As String = models.print4.Select(Function(x) x.cubes.Select(Function(y) y.ownername)).SelectMany(Function(y) y).FirstOrDefault.ToString
'Load items into the listbox
For Each item In dictCount
ListBox1.Items.Add(item.ToString)
Next item
'a useless dictionary method [UN-USED]
For Each key As String In dictCount.Keys.AsEnumerable()
Dim keylist As String = "subTypeName = '{0}', count = '{1}'" + key.ToString + dictCount(key).ToString
Next key
'Load Text from XML to the read only boxes
InfluenceTextBox2.Text = "Grid Name: " + display.ToString
InfluenceTextBox3.Text = "Grid Type: " + gridsizeenum.ToString + " Ship"
'InfluenceTextBox1.Text = "Owner Name: " + ownername.ToString
'Gui Displaying
Dim reader As New StreamReader(FILENAME)
Dim doc As XDocument = XDocument.Load(reader)
Dim xmlstring As String = doc.ToString
LightArmorBlockText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorBlock").ToString
LightArmorSlopeText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorSlope").ToString
LightArmorCornerText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorCorner").ToString
LightArmorCornerInvertedText.Text = "Qty: " + FindWords(xmlstring, "LargeBlockArmorInvCorner").ToString
'Function to calculate oxygentanks and hydrogen tanks
Dim tanks As Integer = FindWords(xmlstring, "MyObjectBuilder_OxygenTank").ToString
Dim oxygentanks As Integer = tanks - FindWords(xmlstring, "LargeHydrogenTank").ToString
OxygenTanksText.Text = "Qty: " + oxygentanks.ToString
HydrogenTanksText.Text = "Qty: " + FindWords(xmlstring, "LargeHydrogenTank").ToString
dictionay = blockNames.GroupBy(Function(x) x).ToDictionary(Function(x) x.Key, Function(y) y.Key)
'Procedural Control Generation
_model = New Model()
_model.Load(FILENAME)
NUMBER_OF_PANELS = _model.print.cubes.cubeBlocks.Count
CalulateControlSizes(NUMBER_OF_PANELS)
mainPanel = _model.print.cubes
mainPanel.Height = MAIN_PANEL_HEIGHT
mainPanel.Width = MAIN_PANEL_WIDTH
mainPanel.Top = MAIN_PANEL_TOP
mainPanel.Left = MAIN_PANEL_LEFT
mainPanel.BackColor = Color.FromArgb(24, 24, 24)
mainPanel.ForeColor = Color.White
mainPanel.AutoScroll = True
mainPanel.VerticalScroll.Visible = True
mainPanel.HorizontalScroll.Visible = True
Me.Controls.Add(mainPanel)
For panelNumber As Integer = 0 To (NUMBER_OF_PANELS - 1)
Dim row As Integer = Math.Floor(panelNumber / PANEL_COLUMNS)
Dim col As Integer = panelNumber Mod PANEL_COLUMNS
Dim newPanel As CubeBlock = _model.print.cubes.cubeBlocks(panelNumber)
newPanel.Top = row * (PANEL_HEIGHT + PANEL_HEIGHT_MARGIN)
newPanel.Left = col * (PANEL_WIDTH + PANEL_WIDTH_MARGIN)
newPanel.Width = PANEL_WIDTH
newPanel.Height = PANEL_HEIGHT
newPanel.BackColor = Color.FromArgb(24, 24, 24)
newPanel.ForeColor = Color.White
mainPanel.Controls.Add(newPanel)
subPanels.Add(newPanel)
Dim newPicture As New PictureBox()
newPicture.Height = PICTURE_BOX_HEIGHT
newPicture.Width = PICTURE_BOX_WIDTH
newPicture.Top = PICTURE_BOX_TOP
newPicture.Left = PICTURE_BOX_LEFT
newPicture.Image = Image.FromFile(IMAGE_PATH)
newPicture.BackColor = Color.FromArgb(24, 24, 24)
newPanel.Controls.Add(newPicture)
Dim newLabel As New Label
newLabel.Height = LABEL_HEIGHT
newLabel.Width = LABEL_WIDTH
newLabel.Top = LABEL_TOP
newLabel.Left = LABEL_LEFT
newLabel.BackColor = Color.Transparent
newLabel.ForeColor = Color.White
newLabel.Text = newPanel.SubtypeName & "(" & newPanel.count & ")"
newLabel.BackColor = SystemColors.Window
newLabel.ForeColor = SystemColors.WindowText
newPanel.Controls.Add(newLabel)
Next panelNumber
End Sub
'END OPEN BUTTON
'Contributors Section
Private Sub InfluenceTopButton1_Click(sender As Object, e As EventArgs) Handles InfluenceTopButton1.Click
'Form2.Show()
End Sub
'XML INPUT LOADING FUNCTION
End Class
Public Class Model
Public print As Model
Public print2 As Model
Public print3 As Model
Public print4 As Model
Public _type As String
Public _id As ID
Public _display As String
Public _display1 As String
Public displayname As String
Public enumerator As String
Public cubes As New CubeGrid
Public info As String
Public Sub Load(filename As String)
Dim reader As New StreamReader(filename)
Dim doc As XDocument = XDocument.Load(reader)
Dim firstNode As XElement = doc.FirstNode
Dim xsiNs = firstNode.GetNamespaceOfPrefix("xsi")
Dim drawingTypes = firstNode.Elements.FirstOrDefault()
Dim drawingType = drawingTypes.Elements.FirstOrDefault()
Dim drawingStr = drawingType.Name.LocalName
print = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
._type = x.Attribute(xsiNs + "type"), ._id = x.Elements("Id").Select(Function(y) New ID() With {
.type = y.Attribute("Type"),
.subtype = y.Attribute("Subtype")
}).FirstOrDefault(),
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.id = y.Element("EntityId"),
.persistentFlags = y.Element("PersistentFlags"),
.position = y.Descendants("Position").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.forward = y.Descendants("Forward").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.up = y.Descendants("Up").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.orientation = y.Descendants("Orientation").Select(Function(z) New location() With {
.w = CType(z.Element("W"), Double),
.x = CType(z.Element("X"), Double),
.y = CType(z.Element("Y"), Double),
.z = CType(z.Element("Z"), Double)
}).FirstOrDefault(),
.cubeBlocks = y.Descendants("MyObjectBuilder_CubeBlock").GroupBy(Function(z) CType(z.Element("SubtypeName"), String)).Select(Function(z) New CubeBlock() With {
.SubtypeName = z.Key,
.count = z.Count
}).OrderBy(Function(z) z.SubtypeName).ToList()
}).FirstOrDefault()
}).FirstOrDefault
print2 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.displayname = y.Element("DisplayName")
}).FirstOrDefault
}).FirstOrDefault()
print3 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.enumerator = y.Element("GridSizeEnum")
}).FirstOrDefault
}).FirstOrDefault
'Not Working - Gets owner name
print4 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("MyObjectBuilder_ShipBlueprintDefinition").Select(Function(y) New CubeGrid() With {
.ownername = y.Element("DisplayName")
}).FirstOrDefault
}).FirstOrDefault
End Sub
End Class
Public Class ID
Public type As String
Public subtype As String
End Class
Public Class CubeGrid
Inherits Panel
Public id As String
Public persistentFlags As String
Public position As location
Public forward As location
Public up As location
Public orientation As location
Public cubeBlocks As List(Of CubeBlock)
Public displayname As String
Public ownername As String
Public enumerator As String
End Class
Public Class location
Public w As Double
Public x As Double
Public y As Double
Public z As Double
End Class
Public Class CubeBlock
Inherits Panel
Public SubtypeName As String
Public username As String
Public count As Integer
End Class
我一直在等待您在组合两个项目之前要了解这两个项目。现在乐趣以几个简单的步骤开始
1(首先阅读XML
2(主面板是一个cubegrid
Public mainPanel As New CubeGrid
Public subPanels As New List(Of CubeBlock) [you can eliminate this since it is gridsinfo.cubeBlocks]
mainPanel = gridsinfo.
使Cubegrid继承面板。
Public Class CubeGrid
Inherits Panel
Public id As String
Public persistentFlags As String
Public position As location
Public forward As location
Public up As location
Public orientation As location
Public cubeBlocks As List(Of CubeBlock)
Public displayname As String
Public enumerator As String
End Class
3(立方体块也是一个需要继承面板的面板。它也应该有一个计数
Public Class CubeBlock
Inherits Panel
Public SubtypeName As String
Public username As String
Public count As Integer
End Class
4(然后面板的数量为dim number_of_panels = gridsinfo.cubeblocks.count。您会发现错误,因为number_of_panels从const更改为dim。因此,您必须将某些const更改为昏暗的。
5(现在更改了for循环
For panelNumber As Integer = 0 To (NUMBER_OF_PANELS - 1)
Dim newPanel As CubeBlock = gridsinfo.cubeBlocks(panelNumber)
Next panelNumber
尝试跟随开始
Imports System.Drawing
Public Class Form1
Const NUMBER_OF_PANELS = 22
Const MAIN_PANEL_WIDTH As Integer = 1000
Const MAIN_PANEL_HEIGHT As Integer = 400
Const MAIN_PANEL_TOP As Integer = 50
Const MAIN_PANEL_LEFT As Integer = 50
Const PANEL_COLUMNS As Integer = 5
Const PANEL_WIDTH_MARGIN As Integer = 10
Const PANEL_HEIGHT_MARGIN As Integer = 10
Const PANEL_WIDTH As Integer = (MAIN_PANEL_WIDTH / PANEL_COLUMNS) - PANEL_WIDTH_MARGIN
Dim PANEL_ROWS As Integer = Math.Ceiling(NUMBER_OF_PANELS / PANEL_COLUMNS)
Dim PANEL_HEIGHT As Integer = (MAIN_PANEL_HEIGHT / PANEL_ROWS) - PANEL_HEIGHT_MARGIN
Dim PICTURE_BOX_MARGIN As Integer = 0.1 * PANEL_HEIGHT
Dim PICTURE_BOX_WIDTH As Integer = PANEL_WIDTH
Dim PICTURE_BOX_HEIGHT As Integer = 0.5 * PANEL_HEIGHT
Const PICTURE_BOX_TOP As Integer = 0
Const PICTURE_BOX_LEFT As Integer = 0
Dim TEXT_BOX_WIDTH As Integer = PANEL_WIDTH
Dim TEXT_BOX_HEIGHT As Integer = 0.4 * PANEL_HEIGHT
Dim TEXT_BOX_TOP As Integer = PICTURE_BOX_HEIGHT + PANEL_HEIGHT_MARGIN
Dim TEXT_BOX_LEFT As Int16 = 0
Dim IMAGE_PATH As String = "c:tempimage1.jpg"
Public mainPanel As New Panel
Public subPanels As New List(Of Panel)
Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
AddHandler Me.Load, AddressOf Form1_Load
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
CalulateControlSizes(NUMBER_OF_PANELS)
mainPanel = New Panel
mainPanel.Height = MAIN_PANEL_HEIGHT
mainPanel.Width = MAIN_PANEL_WIDTH
mainPanel.Top = MAIN_PANEL_TOP
mainPanel.Left = MAIN_PANEL_LEFT
Me.Controls.Add(mainPanel)
For panelNumber As Integer = 0 To (NUMBER_OF_PANELS - 1)
Dim row As Integer = Math.Floor(panelNumber / PANEL_COLUMNS)
Dim col As Integer = panelNumber Mod PANEL_COLUMNS
Dim newPanel As New Panel
newPanel.Top = row * (PANEL_HEIGHT + PANEL_HEIGHT_MARGIN)
newPanel.Left = col * (PANEL_WIDTH + PANEL_WIDTH_MARGIN)
newPanel.Width = PANEL_WIDTH
newPanel.Height = PANEL_HEIGHT
mainPanel.Controls.Add(newPanel)
subPanels.Add(newPanel)
Dim newPicture As New PictureBox()
newPicture.Height = PICTURE_BOX_HEIGHT
newPicture.Width = PICTURE_BOX_WIDTH
newPicture.Top = PICTURE_BOX_TOP
newPicture.Left = PICTURE_BOX_LEFT
newPicture.Image = Image.FromFile(IMAGE_PATH)
newPanel.Controls.Add(newPicture)
Dim newTextBox As New TextBox
newTextBox.Height = TEXT_BOX_HEIGHT
newTextBox.Width = TEXT_BOX_WIDTH
newTextBox.Top = TEXT_BOX_TOP
newTextBox.Left = TEXT_BOX_LEFT
newTextBox.Text = "PANEL NUMBER" + panelNumber.ToString()
newTextBox.BackColor = SystemColors.Window
newTextBox.ForeColor = SystemColors.WindowText
newPanel.Controls.Add(newTextBox)
Next panelNumber
End Sub
Sub CalulateControlSizes(numberOfPanels As Integer)
PANEL_ROWS = Math.Ceiling(NUMBER_OF_PANELS / PANEL_COLUMNS)
PANEL_HEIGHT = (MAIN_PANEL_HEIGHT / PANEL_ROWS) - PANEL_HEIGHT_MARGIN
PICTURE_BOX_MARGIN = 0.1 * PANEL_HEIGHT
PICTURE_BOX_HEIGHT = 0.5 * PANEL_HEIGHT
TEXT_BOX_HEIGHT = 0.4 * PANEL_HEIGHT
TEXT_BOX_TOP = PICTURE_BOX_HEIGHT + PANEL_HEIGHT_MARGIN
End Sub
End Class
这是完整的代码
Imports System.Drawing
Imports System.IO
Imports System.Xml
Imports System.Xml.Linq
Public Class Form1
Const FILENAME As String = "c:temptest.xml"
Dim NUMBER_OF_PANELS = 0
Const MAIN_PANEL_WIDTH As Integer = 1000
Const MAIN_PANEL_HEIGHT As Integer = 1000
Const MAIN_PANEL_TOP As Integer = 50
Const MAIN_PANEL_LEFT As Integer = 50
Const PANEL_COLUMNS As Integer = 5
Const PANEL_WIDTH_MARGIN As Integer = 10
Const PANEL_HEIGHT_MARGIN As Integer = 10
Const PANEL_WIDTH As Integer = (MAIN_PANEL_WIDTH / PANEL_COLUMNS) - PANEL_WIDTH_MARGIN
Dim PANEL_ROWS As Integer = 0
Dim PANEL_HEIGHT As Integer = 0
Dim PICTURE_BOX_MARGIN As Integer = 0
Dim PICTURE_BOX_WIDTH As Integer = PANEL_WIDTH
Dim PICTURE_BOX_HEIGHT As Integer = 0
Const PICTURE_BOX_TOP As Integer = 0
Const PICTURE_BOX_LEFT As Integer = 0
Dim LABEL_WIDTH As Integer = PANEL_WIDTH
Dim LABEL_HEIGHT As Integer = 0
Dim LABEL_TOP As Integer = 0
Dim LABEL_LEFT As Int16 = 0
Dim IMAGE_PATH As String = "c:tempimage1.jpg"
Public _model As Model
Public mainPanel As New CubeGrid
Public subPanels As New List(Of CubeBlock)
Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
AddHandler Me.Load, AddressOf Form1_Load
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
_model = New Model()
_model.Load(FILENAME)
NUMBER_OF_PANELS = _model.print._cubeGrid.cubeBlocks.Count
CalulateControlSizes(NUMBER_OF_PANELS)
mainPanel = _model.print._cubeGrid
mainPanel.Height = MAIN_PANEL_HEIGHT
mainPanel.Width = MAIN_PANEL_WIDTH
mainPanel.Top = MAIN_PANEL_TOP
mainPanel.Left = MAIN_PANEL_LEFT
mainPanel.AutoScroll = True
mainPanel.VerticalScroll.Visible = True
mainPanel.HorizontalScroll.Visible = True
Me.Controls.Add(mainPanel)
For panelNumber As Integer = 0 To (NUMBER_OF_PANELS - 1)
Dim row As Integer = Math.Floor(panelNumber / PANEL_COLUMNS)
Dim col As Integer = panelNumber Mod PANEL_COLUMNS
Dim newPanel As CubeBlock = _model.print._cubeGrid.cubeBlocks(panelNumber)
newPanel.Top = row * (PANEL_HEIGHT + PANEL_HEIGHT_MARGIN)
newPanel.Left = col * (PANEL_WIDTH + PANEL_WIDTH_MARGIN)
newPanel.Width = PANEL_WIDTH
newPanel.Height = PANEL_HEIGHT
mainPanel.Controls.Add(newPanel)
subPanels.Add(newPanel)
Dim newPicture As New PictureBox()
newPicture.Height = PICTURE_BOX_HEIGHT
newPicture.Width = PICTURE_BOX_WIDTH
newPicture.Top = PICTURE_BOX_TOP
newPicture.Left = PICTURE_BOX_LEFT
newPicture.Image = Image.FromFile(IMAGE_PATH)
newPanel.Controls.Add(newPicture)
Dim newLabel As New Label
newLabel.Height = LABEL_HEIGHT
newLabel.Width = LABEL_WIDTH
newLabel.Top = LABEL_TOP
newLabel.Left = LABEL_LEFT
newLabel.Text = newPanel.SubtypeName & "(" & newPanel.count & ")"
newLabel.BackColor = SystemColors.Window
newLabel.ForeColor = SystemColors.WindowText
newPanel.Controls.Add(newLabel)
Next panelNumber
End Sub
Sub CalulateControlSizes(numberOfPanels As Integer)
PANEL_ROWS = Math.Ceiling(NUMBER_OF_PANELS / PANEL_COLUMNS)
'PANEL_HEIGHT = (MAIN_PANEL_HEIGHT / PANEL_ROWS) - PANEL_HEIGHT_MARGIN
PANEL_HEIGHT = 200
PICTURE_BOX_MARGIN = 0.1 * PANEL_HEIGHT
PICTURE_BOX_HEIGHT = 0.8 * PANEL_HEIGHT
LABEL_HEIGHT = 0.1 * PANEL_HEIGHT
LABEL_TOP = PICTURE_BOX_HEIGHT + PANEL_HEIGHT_MARGIN
End Sub
End Class
Public Class Model
Public print As Model
Public print2 As Model
Public print3 As Model
Public _type As String
Public _id As ID
Public _display As String
Public _display1 As String
Public displayname As String
Public enumerator As String
Public _cubeGrid As CubeGrid
Public info As String
Public Sub Load(filename As String)
Dim reader As New StreamReader(filename)
Dim doc As XDocument = XDocument.Load(reader)
Dim firstNode As XElement = doc.FirstNode
Dim xsiNs = firstNode.GetNamespaceOfPrefix("xsi")
Dim drawingTypes = firstNode.Elements.FirstOrDefault()
Dim drawingType = drawingTypes.Elements.FirstOrDefault()
Dim drawingStr = drawingType.Name.LocalName
print = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
._type = x.Attribute(xsiNs + "type"),
._id = x.Elements("Id").Select(Function(y) New ID() With {
.type = y.Attribute("Type"),
.subtype = y.Attribute("Subtype")
}).FirstOrDefault(),
._cubeGrid = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.id = y.Element("EntityId"),
.persistentFlags = y.Element("PersistentFlags"),
.position = y.Descendants("Position").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.forward = y.Descendants("Forward").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.up = y.Descendants("Up").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.orientation = y.Descendants("Orientation").Select(Function(z) New location() With {
.w = CType(z.Element("W"), Double),
.x = CType(z.Element("X"), Double),
.y = CType(z.Element("Y"), Double),
.z = CType(z.Element("Z"), Double)
}).FirstOrDefault(),
.cubeBlocks = y.Descendants("MyObjectBuilder_CubeBlock").GroupBy(Function(z) New With {Key .subName = CType(z.Element("SubtypeName"), String), Key .userName = CType(z.Attribute(xsiNs + "type"), String)}).Select(Function(z) New CubeBlock() With {
.SubtypeName = CType(z.FirstOrDefault().Element("SubtypeName"), String),
.username = z.FirstOrDefault().Attribute(xsiNs + "type"),
.count = z.Count
}).OrderBy(Function(z) z.SubtypeName).ToList()
}).FirstOrDefault
}).FirstOrDefault()
print2 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
._cubeGrid = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.displayname = y.Element("DisplayName")
}).FirstOrDefault()
}).FirstOrDefault()
print3 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
._cubeGrid = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.enumerator = y.Element("GridSizeEnum")
}).FirstOrDefault
}).FirstOrDefault()
End Sub
End Class
Public Class ID
Public type As String
Public subtype As String
End Class
Public Class CubeGrid
Inherits Panel
Public id As String
Public persistentFlags As String
Public gridSizeEnum As String
Public position As location
Public forward As location
Public up As location
Public orientation As location
Public cubeBlocks As List(Of CubeBlock)
Public displayname As String
Public enumerator As String
End Class
Public Class location
Public w As Double
Public x As Double
Public y As Double
Public z As Double
End Class
Public Class CubeBlock
Inherits Panel
Public SubtypeName As String
Public count As Integer
End Class