Как очистить поле перед вводом ввода при использовании TextChanged? - PullRequest
3 голосов
/ 15 декабря 2011

Итак, что я пытаюсь сделать, это иметь возможность непрерывно вводить все 10 текстовых полей. Я начинаю с первого, затем после того, как набрали 3 символа, измените фокус на следующий, а после того, как 3 символа набрали фокус на следующем.

Я выполнил эту часть, но что, если во втором текстовом поле уже есть текст? У меня есть попытки Clear (), но он создает ошибку, из-за которой я не могу набрать более 1 символа.

То есть, когда все текстовые поля заполнены ненужными данными, поэтому, когда я начинаю печатать с первого текстового поля 123, затем переходит ко второму текстовому полю 456, третьему 789 и т.д. но в то время как следующее поле очищается первым.

Я пытаюсь работать с этим:

    public PingIPRange()
    {
        InitializeComponent();

        txtF1.TextChanged += new EventHandler(NextField);
        txtF2.TextChanged += new EventHandler(NextField);
        txtF3.TextChanged += new EventHandler(NextField);
        txtF4.TextChanged += new EventHandler(NextField);

        txtT1.TextChanged += new EventHandler(NextField);
        txtT2.TextChanged += new EventHandler(NextField);
        txtT3.TextChanged += new EventHandler(NextField);
        txtT4.TextChanged += new EventHandler(NextField);

        txtInterval.TextChanged += new EventHandler(NextField);
        txtRepeat.TextChanged += new EventHandler(NextField);
    }

    private void NextField(object sender, EventArgs e)
    {
        if (txtF1.TextLength == 3)
        {
            txtF2.Focus();              
        }
        if (txtF2.TextLength == 3)
        {
            txtF3.Focus();
        }
        if (txtF3.TextLength == 3)
        {
            txtF4.Focus();
        }
        if (txtF4.TextLength == 3)
        {
            txtT1.Focus();
        }
        if (txtT1.TextLength == 3)
        {
            txtT2.Focus();
        }
        if (txtT2.TextLength == 3)
        {
            txtT3.Focus();
        }
        if (txtT3.TextLength == 3)
        {
            txtT4.Focus();
        }
        if (txtT4.TextLength == 3)
        {
            txtInterval.Focus();
        }
        if (txtInterval.TextLength == 3)
        {
            txtRepeat.Focus();
        }
        if (txtRepeat.TextLength == 3)
        {
            btnPing.Focus();
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

Добавьте событие Enter для TextBoxes и выполните SelectAll для текста.

txtF2.Enter += SelectTextOnEnter;
txtF3.Enter += SelectTextOnEnter;
// etc.


private void SelectTextOnEnter(object sender, EventArgs e) { 
  ((TextBox)sender).SelectAll();
}

Кроме того, ваш метод NextField не совсем делает то, что вы думаете, что он делает. Убедитесь, что значения элементов управления TabIndex находятся в правильном порядке, а затем попробуйте изменить код на:

private void NextField(object sender, EventArgs e) {
  if (((TextBox)sender).Text.Length == 3)
    this.SelectNextControl((Control)sender, true, true, false, false);
}

Он выберет следующий элемент управления в соответствии с порядком вкладок формы.

1 голос
/ 15 декабря 2011

Я думаю, что установка свойства Text для текстового поля на пустую строку до вызова метода Focus будет делать то, что вы хотите.

if (txtF1.TextLength == 3)
{
    txtF2.Text = String.Empty;
    txtF2.Focus();
}
.
.
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...