这是我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace testdb
{
public partial class AddProject : Form
{
public AddProject()
{
InitializeComponent();
}
private void btn_addproject_Click(object sender, EventArgs e)
{
string constr = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:/Users /Xprts_3/Documents/Database1.accdb";
string cmdstr = "insert into tb1(name,rollno,projectdate) (@First,@Last,@pdate)";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand com = new OleDbCommand(cmdstr, con);
con.Open();
com.Parameters.AddWithValue("@First", textBox_project_name.Text);
com.Parameters.AddWithValue("@Last", comboBox1_project_status.Text);
com.Parameters.AddWithValue("@pdate", dateTimePicker1.Text);
com.ExecuteNonQuery();
con.Close();
}
}
}
我正在点击按钮将数据添加到数据库中。
现在我想在其中进行验证。如果任何字段为空,我希望向用户显示一条错误消息,而不是将数据插入数据库。如何在Windows窗体中实现这一点?
订阅textBox_project_name
、comboBox1_project_status
和dateTimePicker1
控件的Validating
事件。在这些处理程序中,验证控件中的数据,如果数据无效,则为相应的控件设置ErrorProvider错误。
例如,验证TextBox可能看起来像:
void textBox_project_name_Validating(object sender, CancelEventArgs e)
{
if (String.IsNullOrEmpty(textBox_project_name.Text))
{
e.Cancel = true;
errorProvider1.SetError(textBox_project_name, "Required");
}
else
{
errorProvider1.SetError(textBox_project_name, "");
}
}
private void btn_addproject_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(textBox_project_name.Text) && !String.IsNullOrEmpty(comboBox1_project_status.Text) && !String.IsNullOrEmpty(dateTimePicker1.Text))
{
string constr = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:/Users /Xprts_3/Documents/Database1.accdb";
string cmdstr = "insert into tb1(name,rollno,projectdate) (@First,@Last,@pdate)";
//
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand com = new OleDbCommand(cmdstr, con);
con.Open();
com.Parameters.AddWithValue("@First", textBox_project_name.Text);
com.Parameters.AddWithValue("@Last", comboBox1_project_status.Text);
com.Parameters.AddWithValue("@pdate", dateTimePicker1.Text);
com.ExecuteNonQuery();
con.Close();
}
else
{
lblMsg.Text="Enter data";
}
}
我通常订阅文本框的LostFocus事件,这样,每当用户输入到另一个文本框而当前文本框失去焦点时,它应该提示您想要的任何内容。这对我来说是有效的。
首先,您需要以序列的形式获得所有文本框,例如:
var boxes = Controls.OfType<TextBox>();
然后,您可以对它们进行迭代,并相应地设置错误:
foreach (var box in boxes)
{
if (string.IsNullOrWhiteSpace(box.Text))
{
errorProvider1.SetError(box, "Please fill the required field");
}
}
嗨,如果textBox_project_name,您必须检查if语句。文本,组合框1_project_status。Text和dateTimePicker1.文本不为null或为空。
这是一种方法。
private void btn_addproject_Click(object sender, EventArgs e)
{
if(string.IsNullOrEmpty(textBox_project_name.Text) ||
string.IsNullOrEmpty(comboBox1_project_status.Text) ||
string.IsNullOrEmpty(dateTimePicker1.Text)){
//Display your error
return;
}
string constr = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:/Users /Xprts_3/Documents/Database1.accdb";
string cmdstr = "insert into tb1(name,rollno,projectdate) (@First,@Last,@pdate)";
//
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand com = new OleDbCommand(cmdstr, con);
con.Open();
com.Parameters.AddWithValue("@First", textBox_project_name.Text);
com.Parameters.AddWithValue("@Last", comboBox1_project_status.Text);
com.Parameters.AddWithValue("@pdate", dateTimePicker1.Text);
com.ExecuteNonQuery();
con.Close();
}
您可以通过在按钮点击事件中添加以下代码行来验证文本条目。。。。
if (String.IsNullOrEmpty(textBox_project_name.Text))
{
Response.Write("<script>alert('Enter project name.')</script>");
}
if (String.IsNullOrEmpty(comboBox1_project_status.Text))
{
Response.Write("<script>alert('Enter project status.')</script>");
}
if (string.IsNullOrEmpty(dateTimePicker1.text))
{
Response.Write("<script>alert('Select Proper Date.')</script>");
}
您可以在执行db操作之前验证文本框的值。
private void btn_addproject_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(textBox_project_name.Text) && !String.IsNullOrEmpty(comboBox1_project_status.Text) && !String.IsNullOrEmpty(dateTimePicker1.Text))
{
MessageBox.Show("Enter data");
return;
}
string constr = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:/Users /Xprts_3/Documents/Database1.accdb";
string cmdstr = "insert into tb1(name,rollno,projectdate) (@First,@Last,@pdate)";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand com = new OleDbCommand(cmdstr, con);
con.Open();
com.Parameters.AddWithValue("@First", textBox_project_name.Text);
com.Parameters.AddWithValue("@Last", comboBox1_project_status.Text);
com.Parameters.AddWithValue("@pdate", dateTimePicker1.Text);
com.ExecuteNonQuery();
con.Close();
}
简单的解决方案是在上面制作一个标签,当/如果出现问题时通知用户。在事件处理程序中,您可以根据文本框是否包含文本来更改文本。
对于更高级的解决方案,您可以使用ErrorProvider和数据绑定。
public partial class AddProject : Form
{
public AddProject()
{
InitializeComponent();
}
private void btn_addproject_Click(object sender, EventArgs e)
{
if(string.isNullOrEmpty(textBox_project_name.Text) ||
string.isNullOrEmpty(comboBox1_project_status.Text) ||
string.isNullOrEmpty(dateTimePicker1.Text))
{
errorLabel.Text = "Enter text in all fields";
return;
}
else
{
errorLabel.Text = "";
}
string constr = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:/Users /Xprts_3/Documents/Database1.accdb";
string cmdstr = "insert into tb1(name,rollno,projectdate) (@First,@Last,@pdate)";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand com = new OleDbCommand(cmdstr, con);
con.Open();
com.Parameters.AddWithValue("@First", textBox_project_name.Text);
com.Parameters.AddWithValue("@Last", comboBox1_project_status.Text);
com.Parameters.AddWithValue("@pdate", dateTimePicker1.Text);
com.ExecuteNonQuery();
con.Close();
}
}
尽管已经有几个答案了,但我都不喜欢。最好的方法(imho)是允许用户输入错误的数据,但要做到这一点,当他犯了错误时,他会理解自己。通常,在输入数据的表单上,每个字段都会有一个Label
+TextBox
(或一些其他控件)。订阅每个控件OnTextChanged
(OnValueChanged
等),并在输入的数据正常时进行检查。如果不正常,则将其旁边的标签设为红色(或者以其他方式向用户提示,哪些数据不正常)。
此外,就在插入数据之前,对所有值进行全面检查,以更积极的方式通知用户他的错误:弹出窗口,将焦点设置为具有错误值的控件,等等。
要点是:
-
用户在输入数据时立即查看数据是否错误是很好的(例如,当输入
double
时,能够立即看到错误的小数点字符将使用户快速点击Backspace并进行更正,而如果它只在焦点丢失时显示,则需要额外的步骤:将焦点向后移动、将插入符号向后移动等),所以OnTextChanged
>OnFocusLost
(或Validating
、Validated
等)。 -
推动用户一个接一个地输入特定数据是不好的,因为他可能想稍后输入一些东西,这就是为什么做任何激进的事情(显示弹出窗口、设置焦点等)都是非常糟糕和令人讨厌的事情,这就是你想在用户在填写表单结束时按下按钮
Add
来确认他的输入时才这样做的原因。 -
您想通知用户哪里出了问题,所以盲目地检查值是否不正确,什么都不做是不好的。
-
通知用户数据错误的原因(因为用户可以自己解决)并不重要,除非您进行了最小/最大检查,需要特殊值,检查错误字符,用其他东西检查输入值,如果是,则用红色突出显示两者,或提供有关错误的附加信息(使用
ErrorProvider
,为标签提供ToolTip
等)。你可以懒惰,只在最后(按下按钮时)在弹出窗口中这样做。
例如:
private void textBoxName_TextChanged(object sender, EventArgs e)
{
// name length is maximum 10
labelName.Color = textBoxName.Text.Length > 10 ? Color.Red : SystemColors.WindowText;
}
private void buttonAddProject_Click(object sender, EventArgs e)
{
// check name
string name = textBoxName.Text.Trim()
if(name.Length == 0 || name.Length > 10)
{
labelName.Color = Color.Red;
textBoxName.Focus();
textBoxName.SelectAll();
MessageBox.Show("Name is required. Maximum length is 10.");
return;
}
// check something else
// ... if check fail - focus, messagebox, return
// ...
// insert data
// ...
DialogResult = DialogResult.Ok; // close form
}