Проблема с компонентом textBox

269
28 марта 2017, 10:10

Делаю простой файловый менеджер. Папки/файлы отображает компонент webBrowser. Сверху над webBrowser отображается адрес в textBox и его можно редактировать самостоятельно, тем самым переходя по нужному адресу. Проблема в том, что когда отображается адрес C:\ и если я допишу C:\Windows я соответственно перейду в папку C:\Windows, но если после Windows поставить новый слэш, то он сам стирается и курсор ввода сам переходит в начало всей строчки. Решается тем что нужно намеренно сделать ошибку, написав C:\WindowsS, после поставить слэш и прописать следующую папку C:\WindowsS\Help, а потом убрать ошибку C:\Windows\Help, тогда переходит. Подскажите, как исправить это?

private bool adds = true;
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (Directory.Exists(textBox1.Text) || (File.Exists(textBox1.Text)))
        {
            adds = false;
            webBrowser1.Navigate(textBox1.Text);
            adds = true;
        }
    }
Answer 1

1 Выносим в отдельный метод код из обработчика

private void _navigate(string path)
{
    if (Directory.Exists(path) || (File.Exists(path)))
        webBrowser1.Navigate(path);
}

2 Подписываемся на событие TextBox.KeyDown

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode < Keys.Enter)
    {
        var tb = (TextBox)sender;
        _navigate(tb.Text) 
    }
}

3 Подписываемся на событие кнопки Click

private void button1_Click(object sender, System.EventArgs e)
{
   _navigate(textBox1.Text);
}

4 При потере фокуса, TextBox забывает положение курсора и возвращает его в начало строки когда фокус возвращается к нему. Возвращаем курсор в конец текста, если TextBox терял фокус.

private void textBox1_GotFocus(Object sender, EventArgs e)
{
    var tb = (TextBox)sender;
    tb.SelectionStart = tb.Text.Length > 0 ? tb.Text.Length-1 : 0;
    tb.SelectionLength = 0
}

5 Profit!

TextBox.Changed срабатывает на ввод каждого символа, поэтому на это событие можно повесить предварительную валидацию введенного пути, и подкрашивать фон другим цветом, если пользователь ввел чушь. Только учтите, что File.Exists и Directory.Exists использовать для этого не стоит, т.к. они могут работать медленно, все таки к диску обращаются. Лучше составить словарь запрещенных символов и проверять последний введенный символ. Хотя если вы хотите сделать аналог autocomplete, то без обращений к диску не получится, но это уже другая история.

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

READ ALSO
Создание WebSocket&#39;а

Создание WebSocket'а

Скажите пожалуйста, в чем разница между созданием веб-сокета с помощью конструкции типа:

246
Ошибка при выполнении SQL-запроса в PHP (PDO)

Ошибка при выполнении SQL-запроса в PHP (PDO)

Вроде бы уже поменял все названия столбцов так, что бы они не совпадали с ключевыми словами SQL, но ошибка осталась

304
Помощь с foreach

Помощь с foreach

Не могу понять что не так?, должна выводиться текущая темаВместо этого выводиться весь список тем в переменную $t['code']

264
Ajax запрос ждет ответа от php

Ajax запрос ждет ответа от php

Использую аякс запрос, и хочу чтобы отправить запрос, и не ждать пока обработается пхп скрипт

301