Проверьте наличие пустых текстовых полей с помощью функции C # - PullRequest
2 голосов
/ 09 апреля 2011

Я написал функцию, чтобы проверить, не заполнены ли какие-либо текстовые поля в форме.В настоящее время это работает, если я добавлю его в событие «оставить» TextBox.

Я пытался добавить его в событие нажатия кнопки, но выдает ошибку (NullReferenceException unhandled).

Ниже приведен код:

public void inputBlank(object sender, EventArgs e)
    {
        TextBox userInput;
        userInput = sender as TextBox;
        userTextBox = userInput.Text;
        string blankBoxName = userInput.Name;
        string blankBox = blankBoxName.Remove(0,3);

        if (userTextBox == "")
        {
            errWarning.SetError(userInput, "Please enter a value for " + blankBox);
            userInput.Focus();
        }
        else
        {
            errWarning.SetError(userInput, "");
        }
    }

Просто интересно, если вымог бы посоветовать мне, как это исправить.

Большое спасибо.

Ответы [ 4 ]

5 голосов
/ 09 апреля 2011

Вы хотите проверить пустое текстовое поле в приложении Windows? Лучше использовать его в событии Validating / Validate.

private void sampleTextbox8_Validating(object sender, CancelEventArgs e)
{
    TextBox textbox = sender as TextBox;
    e.Cancel = string.IsNullOrWhiteSpace(textbox.Text);
    errorProvider1.SetError(textbox, "String cannot be empty");
}

private void sampleTextbox8_Validated(object sender, EventArgs e)
{
    TextBox textbox = sender as TextBox;
    errorProvider1.SetError(textbox, string.Empty);
}

Эти ссылки могут вам помочь

  1. Проверка WinForms TextBox (в C #)
  2. Проверка WinForm UI
3 голосов
/ 09 апреля 2011

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

Если вы ищете что-то, связанное с кликом, у вас есть несколько вариантов:

  • Жесткий код списка элементов управления, который вы хотите проверить и реорганизовать функцию проверки, чтобы принять элемент управления, который вы проверяете (на самом деле я бы в любом случае реорганизовал этот способ).
  • [рекурсивно] перебирает элементы управления в форме (используя возможно this.Controls и передавая свойство Controls для каждого элемента контейнера). Затем еще раз передайте эти элементы управления, которые вы обнаружите, что хотите подтвердить обратно в метод проверки.

, например

// your validation method accepting the control
private void ValidateTextBox(TextBox textbox)
{
  // validation code here
}

// bind to click event for button
private void btnValidate_Click(object Sender, EventArgs e)
{
  // you can do manual reference:
  List<TextBox> textboxes = new List<TextBoxes>();
  textboxes.AddRange(new[]{
    this.mytextbox,
    this.mysecondtextbox,
    ...
  });
  //---or---
  // Use recursion and grab the textbox controls (maybe using the .Tag to flag this is
  // on you'd like to validate)
  List<TextBox> textboxes = FindTextBoxes(this.Controls);

  //---then---
  // iterate over these textboxes and validate them
  foreach (TextBox textbox in textboxes)
    ValidateTextBox(textbox);
}

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

private List<TextBox> FindTextBoxes(ControlsCollection controls)
{
  List<TextBox> matches = new List<TextBox>();
  foreach (Control control in collection)
  {
    // it's a textbox
    if (control is TextBox)
      matches.Add(control as TextBox);
    // it's a container with more controls (recursion)
    else if (control is Panel) // do this for group boxes, etc. too
      matches.AddRange((control as Panel).Controls);

    // return result
    return matches;
  }
}
1 голос
/ 09 апреля 2011

Примерно так:

//This is a class property of the form itself. 
public bool IsValid { get; set; }

private void ValidateForm()
{
    Action<Control.ControlCollection> func = null;

    func = (controls) =>
    {
        foreach (Control control in controls)
            if (control is TextBox)
                if (String.IsNullOrEmpty(control.Text))
                    this.IsValid = false;
            else
                func(control.Controls);
    };

    func(Controls);
}

Вы перебираете элементы управления, проверяете, является ли это текстовым полем, если .Text пуст, задаете для переменной класса IsValid значение false.* Затем по нажатию кнопки или что-то в этом роде. Если значение формы ложно, выдается ошибка.

0 голосов
/ 09 апреля 2011

Из того, что я понял, это может показаться, потому что экземпляр sender является Button, а не TextBox, как вы пытаетесь сказать, что он находится в следующей строке:

userInput = sender as TextBox;

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

Поскольку элемент управления TextBox имеет (или, по крайней мере, ожидается, чтоиметь) предопределенное имя / идентификатор, почему бы вам просто не получить доступ явно?Как в:

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