我编写了一个函数来检查表单上的任何文本框是否为空。 如果我将它添加到TextBox'leave'事件,它目前有效。
我尝试将其添加到按钮点击事件,但它会出错(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, "");
}
}
只是想知道你是否可以告诉我如何解决它。
非常感谢。
答案 0 :(得分:5)
您想验证Windows应用程序中的空文本框吗?最好在验证/验证事件中使用它。
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 :(得分:3)
正如我所看到的,直接问题是你将该事件绑定到试图将发送者强制转换为文本输入的按钮。因为发件人变成了按钮控件而不是文本框,所以你会收到nullreferenceexception。
如果您正在寻找与点击相关的内容,您可以选择以下几种方法:
Controls
属性)。然后,再次传递这些控件,您会发现要验证回验证方法。e.g。
// 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;
}
}
答案 2 :(得分:1)
这样的事情怎么样:
//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。
然后在按钮上点击或表格的.IsValid为false,发出错误。
答案 3 :(得分:0)
从我收集的内容来看,这似乎是因为sender
实例是Button
而不是TextBox
,这就是你试图说它是在以下行中:
userInput = sender as TextBox;
这不起作用,因为您单击的按钮是触发事件的控件,因此该控件将成为发件人的原因。
由于TextBox
控件具有(或至少预期具有)预定义的名称/标识符,为什么不明确访问?如:
theNameOfTheTextBox.Text