2 Stimmen

Mit C#-Funktion auf leere Textfelder prüfen

Ich habe eine Funktion geschrieben, um zu prüfen, ob Textfelder in einem Formular leer sind. Es funktioniert derzeit, wenn ich es zum TextBox 'leave' Ereignis hinzufügen.

Ich habe versucht, es zu einem Tastenklick-Ereignis hinzuzufügen, aber es gibt einen Fehler ( NullReferenceException unhandled ).

Nachstehend finden Sie den Code:

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, "");
        }
    }

Ich frage mich nur, ob Sie mir einen Rat geben können, wie ich das Problem beheben kann.

Vielen Dank!

0 Stimmen

Falsch Absender Es handelt sich um eine Schaltfläche, nicht um eine Textbox.

5voto

Anuraj Punkte 17411

Sie möchten ein leeres Textfeld in einer Windows-Anwendung validieren? Verwenden Sie es besser im Validating / Validate Ereignis.

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);
}

Diese Links können Ihnen helfen

  1. WinForms TextBox validieren (in C#)
  2. WinForm UI-Validierung

3voto

Brad Christie Punkte 98327

Das direkte Problem, wie ich es sehe, ist, dass Sie dieses Ereignis an eine Schaltfläche binden, die versucht, den Absender auf eine Texteingabe zu übertragen. Da der Absender eine Schaltfläche Steuerung und nicht ein Textfeld wird, erhalten Sie die nullreferenceexception.

Wenn Sie etwas suchen, das mit Klicks zu tun hat, haben Sie mehrere Möglichkeiten:

  • Hard-code eine Liste der Kontrolle, die Sie überprüfen möchten und refactor Ihre Check-Funktion, um die Kontrolle, die Sie validieren (in der Tat würde ich refactor diese Art und Weise sowieso).
  • [rekursiv] über die Steuerelemente innerhalb des Formulars zu iterieren (vielleicht mit this.Controls und die Übergabe der Controls Eigenschaft für jedes Container-Element). Übergeben Sie dann die zu validierenden Steuerelemente wieder an die Validierungsmethode.

z.B..

// 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);
}

Und um Ihnen eine Vorstellung vom rekursiven Kontrollgreifer zu geben:

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;
  }
}

1voto

Only Bolivian Here Punkte 34429

Wie wäre es mit so etwas wie diesem:

//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);
}

Sie gehen die Steuerelemente durch, prüfen, ob es sich um ein Textfeld handelt, und setzen die Klassenvariable IsValid auf false, wenn der Text leer ist.

Dann auf eine Schaltfläche klicken oder etwas ist die .IsValid des Formulars ist falsch, einen Fehler auslösen.

0voto

Grant Thomas Punkte 43318

Soweit ich weiß, scheint dies daran zu liegen, dass die sender Instanz ist eine Button und nicht ein TextBox was Sie in der folgenden Zeile zu sagen versuchen:

userInput = sender as TextBox;

Dies wird nicht funktionieren, weil die Schaltfläche, auf die Sie geklickt haben, das Steuerelement ist, das das Ereignis ausgelöst hat, weshalb dieses Steuerelement der Absender sein wird.

Desde TextBox Steuerelement einen vordefinierten Namen / Bezeichner hat (oder zumindest erwartet wird), warum greifen Sie nicht einfach explizit auf ihn zu? Wie in:

theNameOfTheTextBox.Text

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X