Как записать выбранный текст со списком и текстовое поле в определенную строку в текстовом файле - PullRequest
0 голосов
/ 14 ноября 2018

Попытка сохранить выбранный текст comboBox и textBox в текстовый файл. однако есть несколько сохраняемых значений.

Во избежание путаницы систематическое сохранение их в определенной строке текстового файла поможет определить значения.

попытался использовать следующее, но приложение зависает.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApp1
{
  public partial class Setups : Form
   {
    public Setups()
    {
        InitializeComponent();
        //this.TopMost = true;
        //this.FormBorderStyle = FormBorderStyle.None;
        //this.WindowState = FormWindowState.Maximized;

    }
    private void textBox8_TextChanged(object sender, EventArgs e)
    {

    }
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {



    }

    static void lineChanger(string newText, string fileName, int line_to_edit)
    {
        string[] arrLine = File.ReadAllLines(fileName);
        arrLine[line_to_edit - 1] = newText;
        File.WriteAllLines(fileName, arrLine);
    }
    public void button5_Click(object sender, EventArgs e)
    {


        lineChanger(string.Format("{0} | {1}", comboBox1.Text, textBox8.Text), "sample.txt", 30);   //


        // Succesfully wrote to file on first line
        //StreamWriter sw = new StreamWriter("Test.txt");

        //sw.WriteLine($"{comboBox1.Text}.{textBox8.Text}");
        //sw.Close();

    }

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Приложение, которое зависает и исключение вне диапазона - это две разные вещи. Будьте точны в своем вопросе, если вам нужна помощь.

Кроме того, ваша lineChanger функция будет , очевидно, потерпит неудачу, если файл, который вы читаете, уже не содержит как минимум 30 строк при нажатии кнопки 5.

Жестко запрограммированное число - это всегда плохая идея в рабочем коде. Если в какой-то момент содержимое файла будет изменено, было бы очень сложно убедиться, что в коде все правильно исправлено.

Если вы действительно хотите использовать такой текстовый файл, то по крайней мере:

  • используйте перечисление или константы, определяющие одно место для цели каждой строки.
  • используйте класс для управления вашей конфигурацией, чтобы только этот класс знал структуру файла.

Но, как уже упоминалось в другом ответе, было бы предпочтительнее использовать другой формат, например JSON. Почти любой другой формат, кроме двоичных данных, будет предпочтительнее текстового файла (при условии, что содержимое является настройками для вашего приложения).

Сказав, что если вы действительно хотите lineChanger, то вам следует добавить такой тест:

if (line_to_edit >= arrLine.Length)
{
    List<string> list(arrLine);
    while (List.Length < line_to_edit) { list.Add(string.Empty); }
    list.Add(newText);
    arrLine = list.ToArray();
}
else { … old code from question… }

Однако, если вы читаете другие строки из файла или часто читаете строки, может быть очень медленно открывать / читать / обновлять / записывать / закрывать файл каждый раз, когда строка изменяется. Еще одна причина, по которой было бы неплохо иметь класс для управления настройками, чтобы вы загружали их один раз при открытии диалога и один раз при закрытии диалога (при условии, что диалог отображается относительно короткий период времени, и это не критично чтобы сохранить изменения немедленно).

0 голосов
/ 14 ноября 2018

Я думаю, что ваш вопрос слишком широкий и требует более подробной информации .

Вам нужно подумать об отделении вашей формы от ваших данных. Создайте класс данных для хранения значений, которые вы хотите сохранить или прочитать, и чтобы пользовательский интерфейс взаимодействовал с этим классом с помощью привязки данных. Тогда ваш класс данных всегда будет содержать самую актуальную информацию.

При необходимости вы можете сериализовать файл данных с помощью TextStream, BinaryFormatter, XmlSerializer или JSON, в зависимости от того, требуется ли доступ к данным из других программ или мест. Вы даже можете использовать встроенный Settings, чтобы сохранить данные до выхода из приложения и прочитать их при следующем запуске.

Поэтому, пожалуйста, отредактируйте вопрос, чтобы уточнить, что вы хотите делать с этими данными, и добавить пример того, как они выглядят в целом (все строки в вашем текстовом файле сейчас). Тогда мы можем ответить более конкретно.

0 голосов
/ 14 ноября 2018

Лучшим решением было бы создать класс со всеми настройками, а затем сериализовать / десериализовать его с помощью JSON.

Используйте nuget для добавления пакета JSON в ваше приложение. Пример кода для сериализации: https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...