Сохранение текста из нескольких textbox, ComboBox и тд. в новый файл

ekety

Здравствуйте, помогите новичку! есть пример:
Public Class Form1
 
    Private Sub ButtonSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Dim Controls() As Control = {TextBox1, TextBox2, TextBox3, TextBox4, ComboBox1, ComboBox2, DateTimePicker1, DateTimePicker2}
        Using StreamWriter As New System.IO.StreamWriter("C:\info.dat")
            For Each Control In Controls
                If TypeOf (Control) Is TextBox Then
                    StreamWriter.WriteLine(String.Format("{0} = {1}", Control.Name, Control.Text))
                ElseIf TypeOf (Control) Is ComboBox Then
                    StreamWriter.WriteLine(String.Format("{0} = {1}", Control.Name, CType(Control, ComboBox).Text))
                ElseIf TypeOf (Control) Is DateTimePicker Then
                    StreamWriter.WriteLine(String.Format("{0} = {1}", Control.Name, CType(Control, DateTimePicker).Value.ToString()))
                End If
            Next
        End Using
    End Sub
 
    Private Sub ButtonLoad_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        For Each Line In System.IO.File.ReadAllLines("C:\info.dat")
            Dim Values() As String = Line.Split("=")
            Dim NameControl As String = Values(0).Trim()
            Dim TextControl As String = Values(1).Trim()
            If Controls.ContainsKey(NameControl) Then
                If TypeOf (Controls(NameControl)) Is TextBox Then
                    Controls(NameControl).Text = TextControl
                ElseIf TypeOf (Controls(NameControl)) Is ComboBox Then
                    Dim objComboBox As ComboBox = CType(Controls(NameControl), ComboBox)
                    objComboBox.Text = TextControl
                    If objComboBox.Items.Contains(TextControl) Then
                        objComboBox.SelectedItem = TextControl
                    End If
                ElseIf TypeOf (Controls(NameControl)) Is DateTimePicker Then
                    CType(Controls(NameControl), DateTimePicker).Value = Date.Parse(TextControl)
                End If
            End If
        Next
    End Sub
 
End Class
Каким образом переделать, чтобы сохранялся в новый файл с диалогом SaveFileDialog (название файла брать из textbox1). Ну и соответственно диалог OpenFileDialog при выборе сохраненного файла с последующей загрузкой в форму?
13 ответов

ekety

чтобы сохранялся в новый файл с диалогом SaveFileDialog (название файла брать из textbox1).
У вас в textbox1 полный путь к файлу или как? И директория постоянная или ее нужно выбирать? Если постоянная, то, без всяких SaveFileDialog, можно в строку
Using StreamWriter As New System.IO.StreamWriter("C:\info.dat")
включить текстбокс, например (если в текстбоксе только название файла):
Using StreamWriter As New System.IO.StreamWriter("C:\" & Textbox1.Text & ".dat")
Если директория не постоянная, то можно использовать диалог выбора папки:
Dim folderBrowserDialog1 As FolderBrowserDialog
Dim path As String
If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
    path = FolderBrowserDialog1.SelectedPath
End If
А затем использовать полученный путь в комбинации с текстбоксом в той же строке:
Using StreamWriter As New System.IO.StreamWriter(path & "\" & Textbox1.Text & ".dat")
Аналогично и с диалогом выбора файла:
Dim openFileDialog1 As New OpenFileDialog()
Dim path1 As String
If openFileDialog.ShowDialog() = DialogResult.OK Then
    path1 = openFileDialog1.FileName
End If
For Each Line In System.IO.File.ReadAllLines(path1)


ekety

Спасибо, все получилось. Есть еще вопрос: На форме есть TabControl1 в нем TabPage1 и соответственно в нем textbox1. Данный код в него не загружает текст, а если перенести textbox1 на форму все работает прекрасно.
Private Sub ButtonLoad_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        For Each Line In System.IO.File.ReadAllLines("C:\info.dat")
            Dim Values() As String = Line.Split("=")
            Dim NameControl As String = Values(0).Trim()
            Dim TextControl As String = Values(1).Trim()
            If Controls.ContainsKey(NameControl) Then
                If TypeOf (Controls(NameControl)) Is TextBox Then
                    Controls(NameControl).Text = TextControl
                ElseIf TypeOf (Controls(NameControl)) Is ComboBox Then
                    Dim objComboBox As ComboBox = CType(Controls(NameControl), ComboBox)
                    objComboBox.Text = TextControl
                    If objComboBox.Items.Contains(TextControl) Then
                        objComboBox.SelectedItem = TextControl
                    End If
                ElseIf TypeOf (Controls(NameControl)) Is DateTimePicker Then
                    CType(Controls(NameControl), DateTimePicker).Value = Date.Parse(TextControl)
                End If
            End If
        Next
    End Sub


ekety

Данный код в него не загружает текст
Если честно, то я не увидел в коде textbox1. У вас свои имена контролов, поэтому понять что и почему довольно трудно. Возможно, нужно добавить в обращение к контролю название вкладки, типа:
TabControl1.TabPage1.Textbox1
хотя, обычно, это не влияет. Но, попробуйте. Скорее же, при задании каких-то условий, а может при переименовании контрола, вы упустили то, что он находится на вкладке. Но, мы об этом можем только гадать.Чисто для проверки последнего предположения, можете создать макет приложения с нормальными названиями контролов и кодом для них, и проверить. Думаю, что в этом случае всё будет работать.


ekety

textbox1 записывается в файл C:\info.dat (первое сообщение в теме) а потом считывается из файла кнопкой ButtonLoad_Click , если textbox1 находится в TabControl1 при нажатии кнопки он заполнятся не хочет, хотя в файле прекрасно сохраняется: TextBox1 = Селеванов Сергей Петрович


ekety

Поставьте в ButtonLoad_Click между 5 и 6 строкой MessageBox.Show(NameControl) и MessageBox.Show(TextControl) и проверьте: то ли у вас считывается из файла. Если "то", тогда перенесите MessageBox-ы ниже: между 6 и 7, потом между 7 и 8. Проверьте: выполняются ли условия?


ekety

тогда перенесите MessageBox-ы ниже: между 6 и 7
Dim Values() As String = Line.Split("=")
            Dim NameControl As String = Values(0).Trim()
            Dim TextControl As String = Values(1).Trim()
           
            If Controls.ContainsKey(NameControl) Then
                MessageBox.Show(NameControl)
                MessageBox.Show(TextControl)
                If TypeOf (Controls(NameControl)) Is TextBox Then
                   
                    Controls(NameControl).Text = TextControl
                ElseIf TypeOf (Controls(NameControl)) Is ComboBox Then
                    Dim objComboBox As ComboBox = CType(Controls(NameControl), ComboBox)
                    objComboBox.Text = TextControl
                    If objComboBox.Items.Contains(TextControl) Then
                        objComboBox.SelectedItem = TextControl
                    End If
                ElseIf TypeOf (Controls(NameControl)) Is DateTimePicker Then
                    CType(Controls(NameControl), DateTimePicker).Value = Date.Parse(TextControl)
                End If
 
 
            End If
        Next
На этой строчке TextBox1 уже не читается


ekety

На этой строчке TextBox1 уже не читается
Тогда разберитесь с 5 строчкой - проблема в ней.


ekety

Тогда разберитесь с 5 строчкой - проблема в ней.
Чего то ни как не осилю. Сделал через ж... , создал дубль textbox1 на самой форме, закрыл его visible и читаю из него. Другого решения пока не нашел.


ekety

А зачем вообще у вас эта строка?:
If Controls.ContainsKey(NameControl) Then
Попробуйте без нее запустить. Только End If тоже уберите.


ekety

Не работает пробовал, блин пол дня уже убил. Плохо быть бестолковым - это я про себя!


ekety

Попробуйте так:
        For Each Line In System.IO.File.ReadAllLines("C:\info.dat")
            Dim Values() As String = Line.Split("=")
            Dim NameControl As String = Values(0).Trim()
            Dim TextControl As String = Values(1).Trim()
                If Mid(NameControl, 1, Len(NameControl) - 1) = "TextBox" Then
                    Controls(NameControl).Text = TextControl
                ElseIf Mid(NameControl, 1, Len(NameControl) - 1) = "ComboBox"  Then
                    Dim objComboBox As ComboBox = CType(Controls(NameControl), ComboBox)
                    objComboBox.Text = TextControl
                    If objComboBox.Items.Contains(TextControl) Then
                        objComboBox.SelectedItem = TextControl
                    End If
                ElseIf Mid(NameControl, 1, Len(NameControl) - 1) = "DateTimePicker" Then
                    CType(Controls(NameControl), DateTimePicker).Value = Date.Parse(TextControl)
                End If
        Next


ekety

Не работает,закрывается окно проги без всяких ошибок.Разобрался как сохранять значения из CheckBox в тот же файл а потом считывать может кому пригодиться Запись:
Private Sub ButtonSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Dim Controls() As Control = {TextBox1, TextBox2, TextBox3, TextBox4, ComboBox1, ComboBox2, DateTimePicker1, DateTimePicker2, CheckBox1}
        Using StreamWriter As New System.IO.StreamWriter("C:\info.dat")
            For Each Control In Controls
                If TypeOf (Control) Is TextBox Then
                    StreamWriter.WriteLine(String.Format("{0} = {1}", Control.Name, Control.Text))
                ElseIf TypeOf (Control) Is ComboBox Then
                    StreamWriter.WriteLine(String.Format("{0} = {1}", Control.Name, CType(Control, ComboBox).Text))
                ElseIf TypeOf (Control) Is DateTimePicker Then
                    StreamWriter.WriteLine(String.Format("{0} = {1}", Control.Name, CType(Control, DateTimePicker).Value.ToString()))
 
                ElseIf TypeOf (Control) Is CheckBox Then
                    StreamWriter.WriteLine(String.Format("{0} = {1}", Control.Name, CType(Control, CheckBox).Checked))
 
                End If
            Next
        End Using
    End Sub
загрузка:
Private Sub ButtonLoad_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        For Each Line In System.IO.File.ReadAllLines("C:\info.dat")
            Dim Values() As String = Line.Split("=")
            Dim NameControl As String = Values(0).Trim()
            Dim TextControl As String = Values(1).Trim()
 
            If TypeOf (Controls(NameControl)) Is TextBox Then
                Controls(NameControl).Text = TextControl
            ElseIf TypeOf (Controls(NameControl)) Is ComboBox Then
                Dim objComboBox As ComboBox = CType(Controls(NameControl), ComboBox)
                objComboBox.Text = TextControl
                If objComboBox.Items.Contains(TextControl) Then
                    objComboBox.SelectedItem = TextControl
                End If
            ElseIf TypeOf (Controls(NameControl)) Is CheckBox Then
                CType(Controls(NameControl), CheckBox).Checked = TextControl
            ElseIf TypeOf (Controls(NameControl)) Is DateTimePicker Then
                CType(Controls(NameControl), DateTimePicker).Value = Date.Parse(TextControl)
            End If
        Next
    End Sub


ekety

Вышеуказанный код работает, но возникла небольшая проблема с textbox! Если он состоит из нескольких строк, запись в файле выглядит так: TextBox1 = 1 2 3 А когда загружаешь эти данные из файла возникает ошибка на этой строке:
Dim TextControl As String = Values(1).Trim()
Индекс находился вне границ массива. Подскажите каким образом это можно исправить?