表單介面上,有時要保留使用者輸入資料的歷史記錄,已往我都是存到登錄表的應用程式區或是編碼後存成 Binary 檔,再於程開啟後在第一時間讀取。
- 表單介面上,有時要保留使用者輸入資料的歷史記錄,已往我都是存到登錄表的應用程式區或是編碼後存成 Binary 檔,再於程開啟後在第一時間讀取。
- VB.net 簡化了存取登錄表的動作,只要一行程式碼就能處理,不像 VB6 要宣告一堆 API。
表單開啟時自動讀入內容:
加入新內容後登錄內容立即更新:
程式碼很簡單(表單上拉二個 ComboBox 就可以測試了):
Public Class Form1
Private 初始化進行中 As Boolean
Private 程式名稱 As String = My.Application.Info.ProductName
Private 公司名稱 As String = My.Application.Info.CompanyName
Private 註冊表位置 As String = "Software\" & 公司名稱 & "\" & 程式名稱
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "使用者登入"
下拉選單初始化(Me) '---讀入預存選單資料內容---
End Sub
Sub 下拉選單初始化(ByVal obj As Control)
'-----下拉選單事件程序(從註冊表讀取選單資料並還原上一次開啟時的狀態)--------
初始化進行中 = True
For Each i In obj.Controls
'---只針對下拉選單做處理---
If TypeName(i) = "ComboBox" Then
Dim c As ComboBox = CType(i, ComboBox)
Dim s = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\" & 註冊表位置 & "\程式參數", i.name, "")
If Not IsNothing(s) Then
c.Items.AddRange(s)
c.SelectedIndex = 0
End If
End If
'---遞回處理---
If i.controls.count > 0 Then
下拉選單初始化(i)
End If
Next
初始化進行中 = False
End Sub
Private Sub 離開選單時的動作(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Leave, ComboBox2.Leave
加入新項目(sender, sender.text)
End Sub
Sub 加入新項目(ByVal cmb As ComboBox, ByVal Text As String)
'-----------------------------------------------
' 1. 若加入的內容是空項則離開程序-
' 2. 檢查 LIST 是否已有此資料,若已有就先移除
'-----------------------------------------------
If Text = "" Then Exit Sub
If cmb.Items.Contains(Text) Then
cmb.Items.Remove(Text)
End If
'--------------------------------------------------------------
' 1. 加入當下資料在最前面第0項(且確保是唯一的)
' 2. 然後再更新註冊表。
' 3. 因為用 Multi_SZ 儲存所以要先把選單內容 Copy 到字串陣列。
' 4. 最後寫入註冊表。
'--------------------------------------------------------------
Dim s() As String
cmb.Items.Insert(0, Text)
cmb.Text = Text
If cmb.Items.Count > 0 Then
'---存到註冊表---
ReDim s(cmb.Items.Count - 1)
cmb.Items.CopyTo(s, 0)
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\" & 註冊表位置 & "\程式參數", cmb.Name, s)
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Close()
End Sub
End Class