VB.net从文本文件加载控件和内容到文本框

时间:2016-08-04 09:51:38

标签: vb.net

...希望这个问题具有可读性......

我有27个文本框。

enter image description here

文本框中的controlname和文本被写入如下文本文件:

System.DateTime.Now.ToString("yyyyMMdd") & "_Names_Config.txt"
            Dim objWriter As New System.IO.StreamWriter(configfile, True)
        'Textboxes
        objwriter.Writeline("tbmax1") 'Control name
        objwriter.Writeline("tbmax1.text) 'The text in the textbox
        objWriter.WriteLine("tbname1") 'Control name
        objWriter.WriteLine(tbname1.Text) 'The text in the textbox
        objWriter.WriteLine("tbext1") 'Control name
        objWriter.WriteLine(tbext1.Text) 'The text in the textbox
'And so on for all the the controls

这对所有文本框和控件都有效,总共54行。

效果很好。文本文件如下所示:

enter image description here

好的,现在问题。应该搜索文本文件的load button - >找到与表单控件匹配的控件 - >使用下面的行并在控件的文本框中填写该特定行 - >然后找到下一个控件并执行相同操作。

加载按钮:这是#1尝试;

'Openfiledialog, then:
            Using reader As New StreamReader(OpenFileDialog1.FileName.ToString)
            Dim currentTextBox As TextBox = Nothing
            While reader.Peek > -1
                Dim line As String = reader.ReadLine()
                If Not String.IsNullOrEmpty(line) Then
                    Dim tmpTextbox = Controls.Find(line, True) 'Try to find text according to line 
                    If tmpTextbox.Any() Then 'It´s a textbox name
                        currentTextBox = DirectCast(tmpTextbox(0), TextBox)
                    Else 
                        '?
                    End If
                End If
            End While
        End Using

以下是我完全不懂的内容。在加载文本文件后,请查看27个文本框中发生的情况之前和之后。

它应该是什么样的:

enter image description here

它会是什么样子:

enter image description here

“编辑频道”实际上是表单本身的标题。我无语了。因为我完全不明白为什么会发生这种情况以及加载代码,所以我转向了另一次尝试。

#2尝试:

            Using reader As New StreamReader(OpenFileDialog1.FileName)
            Dim Line As String = reader.ReadLine()
            Dim Current As Integer = 0
            Dim TB As TextBox = Nothing
            While Not IsNothing(Line) 'It will be Nothing when file is over

                '__________________________________________________________________1
                If Line.StartsWith("tbext1") Then
                    'We will increment CurrentChannel, as we changed the section
                    Current += 1
                    For onetonine = 1 To 9
                        tbext1.Text = Line
                    Next
                End If
                If Line.StartsWith("tbname1") Then
                    'We will increment CurrentChannel, as we changed the section
                    Current += 1
                    For onetonine = 1 To 9
                        tbname1.Text = Line
                    Next
                End If
                If Line.StartsWith("tbmax1") Then
                    'We will increment CurrentChannel, as we changed the section
                    Current += 1
                    For onetonine = 1 To 9
                        tbmax1.Text = Line
                    Next
                End If
                '__________________________________________________________________2
'Then I guess this would go on for all the 27 textboxes (probably a really bad attempt)

            End While
        End Using

然而,这只是进入休息模式。

1 个答案:

答案 0 :(得分:3)

如果填写Else部分,您的第一种方法已经有效:

If tmpTextbox.Any() Then
    currentTextBox = DirectCast(tmpTextbox(0), TextBox)
ElseIf currentTextBox IsNot Nothing Then
    currentTextBox.Text = line
End If

但是你不应该在生产代码中使用它:

  • 控制名称是数据库记录或文件条目的非常糟糕的密钥:
    • 他们将来可以改变,你不会注意到它
    • 它们与GUI相关,不应该是属性的标识符
    • 不是故障安全的,因为可能存在多个具有相同名称的控件
  • 不要将键值对存储在不同的行上,这使得它们之后难以理解,不易阅读并且更容易出错

如果你想使用一行,你需要一个用户永远不会输入的分隔符,它可以是多个字符的组合,如|::|或类似的东西。然后,您可以稍后使用String.Split({"|::|"}, StringSplitOptions.None)来获取两个令牌。

然而,这仍然不是一个好方法,也不是100%安全。所以更好的方法是

  • 序列化/反序列化List(Of String)
  • 如果您想以人类可以阅读的方式存储它,您应该更喜欢XML。

以下是一个如何轻松编写/读取xml的示例:

' write all TextBoxes to a file '
Dim allTextBoxes = TextBoxPanel.Controls.OfType(Of TextBox)()

Dim doc As New XDocument(New XElement("Channels"))
For Each txt In allTextBoxes
    doc.Root.Add(New XElement(txt.Name, txt.Text.Trim()))
Next
doc.Save(OpenFileDialog1.FileName)

' later read it ... '
Dim xml As XDocument = XDocument.Load(OpenFileDialog1.FileName)
For Each element As XElement In xml.Descendants("Channels").Descendants()
    Dim txt = allTextBoxes.FirstOrDefault(function(t) t.Name = element.Name)
    If txt IsNot nothing
        txt.Text = element.Value 
    End If
Next