Как ограничить количество указанных c символов текстового поля c# формы приложения - PullRequest
3 голосов
/ 22 января 2020

Я хотел знать, как ограничить количество указанных c символов текстового поля в c# форме приложения. например, я хочу ограничить ввод пользователем - ( минус ) только один раз , а затем, если он попытается ввести снова, я хочу, чтобы программа запретила ввод этого снова.

Примеры: -123 или 123- или 123-123 ( только один -).

Если пользователь удалить -, он должен иметь разрешение на ввод одного - снова и, конечно, не более!

Я хочу предотвратить пользователь вводит ----1234 или 1234--, или 123-4--21, или что еще вы думаете !!

Вот что я пытаюсь:

private void txtStopAfterXTimes_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.OemMinus || e.KeyCode == Keys.Subtract)
    {
        if (txtStopAfterXTimes.Text.Count((char)'-', 1))
        {
            e.SuppressKeyPress = true;
        }
        else if (txtStopAfterXTimes.Text.Count((char)'-', 0))
        {
            e.SuppressKeyPress = false;
        }
    }
}

я знаю, что это неправильно но, пожалуйста, помогите! спасибо ...

Ответы [ 2 ]

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

Вы можете изменить Text в txtStopAfterXTimes с помощью 2 способами: нажатием клавиши (-) или вставкой значения. Вот почему мы должны обрабатывать 2 события: KeyPress для - нажатия клавиш и TextChanged для вставки текста:

Код: (WinForms)

private void txtStopAfterXTimes_TextChanged(object sender, EventArgs e) {
  // When pasting a text into txtStopAfterXTimes...
  TextBox box = sender as TextBox;

  StringBuilder sb = new StringBuilder(box.Text.Length);

  bool containsMinus = false;

  // We remove all '-' but the very first one
  foreach (char ch in box.Text) {
    if (ch == '-') {
      if (containsMinus)
        continue;

      containsMinus = true;
    }

    sb.Append(ch);
  }

  box.Text = sb.ToString();
}

private void txtStopAfterXTimes_KeyPress(object sender, KeyPressEventArgs e) {
  TextBox box = sender as TextBox;

  // we allow all characters ...
  e.Handled = e.KeyChar == '-' &&             // except '-'
              box.Text.Contains('-') &&       // when we have '-' within Text
             !box.SelectedText.Contains('-'); // and we are not going to remove it
}
0 голосов
/ 22 января 2020

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

Это решение, которое я буду использовать, потому что вам также нужно позаботиться о пасте.

  • Вкл. keyPress Я проверяю, не является ли символ первым "-", затем я проигнорирую его, в противном случае я приму его.
  • Вкл. WndProc Я ловлю WM_PASTE и очищаю текст буфера обмена, удаляя все вхождения «-», кроме первого. Вы также можете легко решить прекратить вставку, если ввод недопустим.

Вот реализация:

using System.Runtime.InteropServices;
using System.Windows.Forms;
public class MyTextBox : TextBox
{
    private const int WM_PASTE = 0x0302;
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool MessageBeep(int type);
    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_PASTE) { base.WndProc(ref m); }
        else {
            //You can sanitize the input or even stop pasting the input
            var text = SanitizeText(Clipboard.GetText());
            SelectedText = text;
        }
    }
    protected virtual string SanitizeText(string value)
    {
        if (Text.IndexOf('-') >= 0) { return value.Replace("-", ""); }
        else {
            var str = value.Substring(0, value.IndexOf("-") + 1);
            return str + value.Substring(str.Length).Replace("-", "");
        }
    }
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == '-' && this.Text.IndexOf('-') >= 0) {
            e.Handled = true;
            MessageBeep(0);
        }
        else {
            base.OnKeyPress(e);
        }
    }
}
...