我试图用try catch验证windows表单,到目前为止我成功了。我的目标是当有人忘记填补空白或输入错误的条目时,捕获返回消息框并发出警告。现在我对每个要验证的控件都有Validating事件,所以当有人将它留空或格式不正确时,它会在控件旁边显示错误。到目前为止似乎还不错(至少对我来说)但我的问题是,如果用户甚至没有点击一个框,它只显示消息框,但它不会突出显示错误的控件。
以下是我的代码:
private void createButton_Click(object sender, EventArgs e)
{
try
{
Book newBook = new Book(titleBox.Text, authBox.Text, Convert.ToInt32(yearBox.Text), Convert.ToInt32(editBox.Text), pubComboBox.Text, descBox.Text);
bookList.Add(newBook);
booklistListBox.DataSource = bookList;
}
catch (FormatException)
{
MessageBox.Show("You probably missed a gap or put in incorrect form");
}
}
以及那些验证事件:
private void titleBox_Validating(object sender, CancelEventArgs e)
{
if (titleBox.Text.Trim() == String.Empty)
{
errorProvider.SetError(titleBox, "Title is required");
e.Cancel = true;
}
else
{
errorProvider.SetError(titleBox, "");
}
}
private void authBox_Validating(object sender, CancelEventArgs e)
{
if (authBox.Text.Trim() == String.Empty)
{
errorProvider.SetError(authBox, "Author is required");
e.Cancel = true;
}
else
{
errorProvider.SetError(authBox, "");
}
}
private void yearBox_Validating(object sender, CancelEventArgs e)
{
if (yearBox.Text.Trim() == String.Empty)
{
errorProvider.SetError(yearBox, "Year is required");
e.Cancel = true;
}
else
{
errorProvider.SetError(yearBox, "");
}
}
private void editBox_Validating(object sender, CancelEventArgs e)
{
if (editBox.Text.Trim() == String.Empty)
{
errorProvider.SetError(editBox, "Edition is required");
e.Cancel = true;
}
else
{
errorProvider.SetError(editBox, "");
}
}
private void pubComboBox_Validating(object sender, CancelEventArgs e)
{
if (pubComboBox.Text.Trim() == String.Empty)
{
errorProvider.SetError(pubComboBox, "Publisher is required");
e.Cancel = true;
}
else
{
errorProvider.SetError(pubComboBox, "");
}
}
private void descBox_Validating(object sender, CancelEventArgs e)
{
if (descBox.Text.Trim() == String.Empty)
{
errorProvider.SetError(descBox, "Description is required");
e.Cancel = true;
}
else
{
errorProvider.SetError(descBox, "");
}
}
有没有办法,我不知道,改变焦点或类似的东西,强迫按下创建按钮? 谢谢
答案 0 :(得分:0)
尝试使用ValidateChildren():
private void createButton_Click(object sender, EventArgs e)
{
bool gotIssues = this.ValidateChildren();
if (gotIssues)
{
// someone didn't validate well...
}
}
答案 1 :(得分:0)
所以,这里的问题是你想要在两种情况中突出显示它:
1)当您离开该字段并且其内容无效时(在这种情况下为空) 2)单击“创建”按钮时,相关字段的内容无效
所以我会创建一个textBox_checkIfEmpty(object sender, EventArgs e)
方法:
private void textBox_checkIfEmpty(object sender, EventArgs e)
{
var asTb = sender as TextBox;
if (asTb != null && asTb.Text.Trim() == String.Empty)
{
errorProvider.SetError(asTb, "I'll leave it to you to abstract the error message appropriately");
e.Cancel = true;
}
else
{
errorProvider.SetError(asTb, "");
}
}
然后,您可以将此方法设置为所需所需控件上Validate
事件的处理程序,也可以从创建按钮的处理程序中调用相同的方法,循环显示所需的TextBox
实例并在每个实例上执行该方法。
<强>更新强>
J. Hudler的ValidateChildren
解决方案将是一个更加(开发人员)有效的尾部,而不是循环通过所需的控件。也就是说,如果表单有很多子项,并且您只需要验证几个,那么循环可能会有所帮助。只取决于您的具体情况。我唯一的另一个问题是ValidateChildren
是否是无限递归的,或者它是否只降低了一级(直接的孩子而不是所有的后代)。
答案 2 :(得分:0)
当鼠标单击控件然后将其从控件中保留时,验证控件调用的事件。在您没有单击控件的情况下,它不会触发验证事件。你可以通过创建自己的函数并在creat事件上调用它们来完成此操作。
private void button1_Click(object sender, EventArgs e)
{
textBox1_Validating(sender);
}
public void textBox1_Validating(object sender)
{
MessageBox.Show("validating");
errorProvider1.SetError(textBox1, "provide");
}