我知道,也許這是一個經常出現的問題,但我一直無法解決這個問題。如何使用 VB.Net 將此復選框值保存在 XML 檔案中?
Private Sub ChkVul_Click(sender As Object, e As EventArgs) Handles ChkVul.Click
If ChkVul.Checked = True Then
Me.pnlInsert.Visible = True
Else
Me.pnlInsert.Visible = False
End If
End Sub
uj5u.com熱心網友回復:
在我為您提供答案之前,我想建議您對代碼稍作更改。由于您是pnlInsert.Visible根據條件設定布林值,該條件本身回傳一個布林值,因此只需首先擺脫條件檢查:
pnlInsert.Visible = ChkVul.Checked
現在回答你的問題。您本質上要問的是如何將值寫入 XML 檔案。需要考慮的是 XML 只是一種標記語言。歸根結底,XML 檔案只是一個包含格式化文本的檔案。
如果您還沒有要讀取的 XML 檔案,只需創建一個 XDocument 的新實體(檔案)。如果您確實有 XML 檔案,則通過呼叫靜態 XDocument.Load 方法(檔案)創建 XDocument 的新實體。這是一個獲取檔案位置并嘗試加載 XDocument 的函式,如果無法加載,則回傳一個帶有單個<root>元素的空白 XDocument:
Private Function LoadOrCreateXml(filename As String) As XDocument
Dim document = New XDocument()
document.Add(New XElement("root"))
Try
If (Not String.IsNullOrWhiteSpace(filename) AndAlso IO.File.Exists(filename)) Then
document = XDocument.Load(filename)
End If
Catch ex As Exception
' for the sake of this example, just silently fail
End Try
Return document
End Function
現在您有了 XDocument,只需撰寫值即可。您沒有提供任何關于值應該去哪里或標簽名稱應該是什么的詳細資訊,所以我將假設它應該是元素的子<root />元素,并且值看起來像這樣:<ChkVul>true/false</ChkVul>.
為此,我們需要<root />通過呼叫 XDocument 上的 Element 方法(檔案)來獲取元素,然后呼叫生成的 XElement 上的 Add 方法(檔案)來添加我們的節點和值:
Dim document = LoadOrCreateXml("my-xml-file.txt")
document.Element("root").Add(New XElement("ChkVul", ChkVul.Checked))
所有這一切的最后一部分是將記憶體中的 XDocument 寫回檔案。您可以利用 XDocument.Save 方法(檔案):
Dim filename = "my-xml-file.txt"
Dim document = LoadOrCreateXml(filename)
document.Element("root").Add(New XElement("ChkVul", ChkVul.Checked))
document.Save(filename)
uj5u.com熱心網友回復:
也許這就是你的想法。我用其他控制元件對此進行了測驗,
Public Class Form1
Private SavePath As String = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"MyControls.xml") 'some valid path <-----------<<<
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
SaveCheckedState(ChkVul, "ChkVul", True)
End Sub
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
If IO.File.Exists(SavePath) Then
Try
MyControls = XElement.Load(SavePath)
For Each el As XElement In MyControls.Elements
Dim ctrl() As Control = Me.Controls.Find(el.@name, True)
If ctrl.Length > 0 Then
Dim chkd As System.Reflection.PropertyInfo = ctrl(0).GetType().GetProperty("Checked")
Dim chkdV As Boolean = Boolean.Parse(el.@checked)
chkd.SetValue(ctrl(0), chkdV)
End If
Next
Catch ex As Exception
'todo
End Try
End If
End Sub
Private Sub ChkVul_CheckedChanged(sender As Object, e As EventArgs) Handles ChkVul.CheckedChanged
If ChkVul.Checked Then
Me.pnlInsert.Visible = True
Else
Me.pnlInsert.Visible = False
End If
SaveCheckedState(ChkVul, "ChkVul")
End Sub
Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
SaveCheckedState(RadioButton1, "RadioButton1")
End Sub
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
SaveCheckedState(CheckBox1, "CheckBox1")
End Sub
Private MyControls As XElement = <controls>
</controls>
Private Sub SaveCheckedState(Ctrl As Control,
Name As String,
Optional Save As Boolean = False)
If Ctrl.GetType().GetProperty("Checked") IsNot Nothing Then
Dim chkd As System.Reflection.PropertyInfo = Ctrl.GetType().GetProperty("Checked")
Dim chkdV As Boolean = CBool(chkd.GetValue(Ctrl))
Dim ie As IEnumerable(Of XElement)
ie = From el In MyControls.Elements
Where el.@name = Ctrl.Name
Select el Take 1
Dim thisXML As XElement
If ie.Count = 0 Then
thisXML = <ctrl name=<%= Name %>></ctrl>
MyControls.Add(thisXML)
Else
thisXML = ie(0)
End If
thisXML.@checked = chkdV.ToString
End If
If Save Then
Try
MyControls.Save(SavePath)
Catch ex As Exception
'todo
' Stop
End Try
End If
End Sub
End Class
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503744.html
標籤:VB.net
上一篇:如何解決System.Data.OleDb.OleDbException:'FROM子句中的語法錯誤
下一篇:遍歷字串中的值以傳遞給SQL
