Как связать текст TextBox с содержимым файла? - PullRequest
1 голос
/ 24 января 2020

Я создал редактор, унаследовавший TextBox.

Редактор загружает данные из файла, как показано ниже.

public Editor()
{
    this.Text = File.ReadAllText(fileName);
}

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

Другими словами, хотя я изменяю содержимое редактора, изменения не применяются к файлу.

Для этого мне нужно напишите дополнительный код, как показано ниже.

File.WriteAllText(fileName, content);

Проблема в том, что я не знаю, куда поместить приведенный выше код.

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

Но я не знаю подходящей позиции для размещения вышеуказанного кода, за исключением TextChanged обработчика событий.

Есть ли способ формулы c решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 24 января 2020

Есть ли формула c способ решить эту проблему?

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

Распространенным решением проблем такого рода является реализация какого-либо поведения регулирования, т. Е. Когда вы обнаруживаете нажатие клавиши, вы ждете x секунд, прежде чем записать данные обратно в хранилище.

Посмотрите, как ReactiveUI решает эту проблему с помощью операторов Rx и LINQ. Вы также можете использовать таймер, который вы, например, запускаете при возникновении события TextChanged.

Другой вариант, конечно, заключается в предоставлении кнопки или другого элемента управления вводом, который позволяет пользователю решать, когда сохранять.

2 голосов
/ 24 января 2020

Прежде всего, используйте таймер для сохранения текста с некоторым периодом (около 5 сек c). Сохраните текст asyn c, чтобы избежать проблем с производительностью.

    private bool needSave;

    private object locker = new object();

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.Text = File.ReadAllText("test.txt");

        timer1.Interval = 5000;

        timer1.Enabled = true;
    }

    private async void timer1_Tick(object sender, EventArgs e)
    {
        if (needSave)
        {
            needSave = false;

            await Task.Run(() => Save());
        }
    }

    private void Save()
    {
        lock (locker)
        {
            File.WriteAllText("test.txt", textBox1.Text);
        }
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        needSave = true;
    }
1 голос
/ 24 января 2020

Подобный способ решения @ Святослав Вовденко таков:

private void Form1_Load(object sender, EventArgs e)
{
    textBox1.Text = File.ReadAllText("test.txt");

    timer1.Interval = 2000;
    timer1.Enabled = false;  //***********
}

private async void timer1_Tick(object sender, EventArgs e)
{ 
    timer1.Stop();   //***********
    await Task.Run(() => Save()); 
}

private void Save()
{
    lock (this.timer1)     //***********
        File.WriteAllText("test.txt", textBox1.Text); 
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
    timer1.Stop();     //*********** skip pending save and start again
    timer1.Start();    //***********
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...