Как вставить 12 последовательных цифр в 4 текстовых поля, используя свойство TextChanged? - PullRequest
4 голосов
/ 14 декабря 2011

Я пытаюсь вставить (с помощью мыши или клавиатуры) 12-значное число (IP-адрес, но без интервалов) в 4 поля.Каждый из них имеет максимальную длину 3.

Я пытаюсь сделать это, используя TextChange, текстовое поле, свойство.Я пытался использовать Substring, но не каждый октет работает.

    public PingIPRange()
    {
        InitializeComponent();

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

    private void NextField(object sender, EventArgs e)
    {
        if (txtF1.TextLength == 3)
        {
            txtF2.Focus();
            txtF1.Text = txtF1.Text.Substring(0, 3);
            txtF2.Text = txtF1.Text.Substring(3, 30);
        }
        if (txtF2.TextLength == 3)
        {
            txtF3.Text = txtF2.Text.Substring(3, 27);
            txtF3.Focus(); 
        }
        if (txtF3.TextLength == 3)
        {
            txtF4.Focus();
        }
    }

Ответы [ 4 ]

4 голосов
/ 14 декабря 2011

Попробуйте поместить этот код в метод NextField. И только для подключения к событию textxt textbox txtF1.

TextBox txt = (TextBox) sender; 
var s1 = txt.Text.Split('.');

if(s1.Length==4)
{
    txtF1.Text = s1[0];
    txtF2.Text = s1[1];
    txtF3.Text = s1[2];
    txtF4.Text = s1[3];
} 

ОБНОВЛЕНИЕ: Поскольку вы обновили вопрос о том, что не будет никакого символа точки, вы можете разбить строку следующим образом

var s1=Enumrable
    .Range(0,4)
    .Select(i => txt.Text.Substring(i * 3, 3))
    .ToArray();
2 голосов
/ 14 декабря 2011

Это не будет работать так хорошо, как вы пытаетесь изменить текст в обработчике TextChanged - так что он будет запускаться снова. Почему бы просто не сделать так, чтобы обработчик событий изменил фокус на следующий блок, если длина равна 3, чтобы избежать циклического цикла.

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

Вы можете использовать события KeyUp и MouseUp на txtF1 и использовать следующий код:

    private void txtF1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.V)
        {
            PasteText();
        }
    }

    private void txtF1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right &&
            ((TextBox)sender).Modified)
        {
            PasteText();
        }
    }

    private void PasteText()
    {
        string[] val = txtF1.Text.Split('.');

        txtF1.Text = val[0].ToString();
        txtF2.Text = val[1].ToString();
        txtF3.Text = val[2].ToString();
        txtF4.Text = val[3].ToString();
    }

ПРИМЕЧАНИЕ. Я не включил обработку ошибок.

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

Работает, только если он вставлен в TextF1.

public PingIPRange()
{
    InitializeComponent();

    txtF1.TextChanged += new EventHandler(PasteNumbers);
}

private void PasteNumbers(object sender, EventArgs e)
{
    if (txtF1.TextLength > 9) { txtF4.Text = txtF1.Text.Substring(9, 3); }
    if (txtF1.TextLength > 6) { txtF3.Text = txtF1.Text.Substring(6, 3); }
    if (txtF1.TextLength > 3)
    {
       txtF2.Text = txtF1.Text.Substring(3, 3);
       txtF1.Text = txtF1.Text.Substring(0, 3);
    }
}

Редактировать, чтобы быть полностью правильным, вам нужно сделать мин. Между (txtF1.TextLength - 9) и 3 в подстроке, чтобы не было проблем OutOfBound для txtF4, и то же самое для txtF3 и txtF2.

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