当其中一个字段不为空时,我试图显示错误.用旧的方式一次只做一个领域是费时费力的.那么,是否有一种方法可以创建一个ErrorProvider数组来处理这个问题?
这是我到现在为止的密码。
try
{
if (TxtModule.Text != String.Empty && CmbParts.Text != String.Empty && TxtBrand.Text != String.Empty && TxtHeadMat.Text != String.Empty && TxtIPP.Text != String.Empty && TxtRate.Text != String.Empty && TxtManu.Text != String.Empty && TxtPrice.Text != String.Empty && TxtQuan.Text != String.Empty && TxtSN.Text != String.Empty && TxtToolsize.Text != String.Empty)
{
OleDbCommand cmd = new OleDbCommand
{
CommandType = CommandType.Text,
CommandText = "Insert Into Items ([PartName], [SerialNum], [ModNum], [ToolSize], [Manufact], [Brand], [Price], [Quant], [ItemsPerPack], [HeadMaterial], [Describe]) VALUES(@PatN,@SerialNum,@ModNum, @ToolSize,@Manu,@Brnd,@Prce,@Qty, @IPP,@HeadMat,@Describe)"
};
cmd.Parameters.AddWithValue("@PatN", CmbParts.SelectedItem.ToString());
cmd.Parameters.AddWithValue("@SerialNum", TxtSN.Text);
cmd.Parameters.AddWithValue("@ModNum", TxtModule.Text);
cmd.Parameters.AddWithValue("@ToolSize", TxtToolsize.Text);
cmd.Parameters.AddWithValue("@Manu", TxtManu.Text);
cmd.Parameters.AddWithValue("@Brnd", TxtBrand.Text);
cmd.Parameters.AddWithValue("@Prce", TxtPrice.Text);
cmd.Parameters.AddWithValue("@Qty", TxtQuan.Text);
cmd.Parameters.AddWithValue("@IPP", TxtIPP.Text);
cmd.Parameters.AddWithValue("@HeadMat", TxtHeadMat.Text);
cmd.Parameters.AddWithValue("@Describe", TxtDescription.Text);
cmd.Connection = GetConnection();
int result = cmd.ExecuteNonQuery();
if (result == 1)
{
MessageBox.Show("Data Inserted", "Success");
this.Close();
}
}
else
{
ErrorProvider CmbdError = new ErrorProvider();
CmbdError.SetError(CmbParts, "What item to add");
CmbParts.Focus();
ErrorProvider SNError = new ErrorProvider();
SNError.SetError(TxtSN, "Define Serial Number");
TxtSN.Focus();
ErrorProvider ModuleError = new ErrorProvider();
ModuleError.SetError(TxtModule, "Define Module Number");
TxtModule.Focus();
ErrorProvider ToolSizeError = new ErrorProvider();
ToolSizeError.SetError(TxtToolsize, "Set Tool Size");
TxtToolsize.Focus();
ErrorProvider ManufactorError = new ErrorProvider();
ManufactorError.SetError(TxtManu, "Defind Manufacturer");
TxtManu.Focus();
ErrorProvider BrandError = new ErrorProvider();
BrandError.SetError(TxtBrand, "Define Brand");
TxtBrand.Focus();//list goes on
}
}
catch (OleDbException ex)
{
MessageBox.Show(ex.Message);
}发布于 2021-01-30 09:43:40
如前所述,您只需要一个ErrorProvider组件来报告错误。ErrorProvider实现了IExtenderProvider接口,以扩展容器中的控件,并提供其他属性,即Error、IconAlignment和IconPadding提供者属性。因此,您只需要通过专用的setter/getter方法设置/获取它们的值。
在您的示例中,创建一个获取控件的方法:
private IEnumerable<Control> GetAllControls(Control parent, bool recursively = false)
{
// You will be needing this if the controls are hosted by different containers.
if (recursively)
{
var cs = parent.Controls.OfType<Control>();
return cs.SelectMany(c => GetAllControls(c)).Concat(cs);
}
else
return parent.Controls.OfType<Control>();
}并按以下方式验证这些条目:
private void someButton_Click(object sender, EventArgs e)
{
errorProvider1.Clear();
var cs = GetAllControls(this, true);
foreach (var c in cs)
{
if (c is TextBox && c.Text.Trim().Length == 0)
errorProvider1.SetError(c, "Error message...");
else if (c is ComboBox cb && cb.SelectedIndex == -1)
errorProvider1.SetError(c, "Error Message...");
// else for more types...
}
var first = cs.FirstOrDefault(x => !string.IsNullOrEmpty(errorProvider1.GetError(x)));
if (first != null)
{
first.Focus();
return;
}
// else you are good to go...
}如果您在代码中创建ErrorProvider,而不是将一个实例放到设计器中,那么您也应该处理它。
private void someForm_FormClosed(object sender, FormClosedEventArgs e)
{
errorProviderCreatedByCode.Dispose();
}我在您的代码片段中看到,您需要设置不同的Error消息。在这种情况下,您需要以某种方式将控件与其消息链接。
解决方案1: Control.Tag
在设计时为每个控件设置Tag属性以存储Error值。
验证代码。再看一遍。
private void someButton_Click(object sender, EventArgs e)
{
errorProvider1.Clear();
var cs = GetAllControls(this, true);
string err;
foreach (var c in cs)
{
err = c.Tag as string;
if (c is TextBox && c.Text.Trim().Length == 0 && err != null)
errorProvider1.SetError(c, err);
else if (c is ComboBox cb && cb.SelectedIndex == -1 && err != null)
errorProvider1.SetError(c, err);
// else for more types...
}
var first = cs.FirstOrDefault(x => !string.IsNullOrEmpty(errorProvider1.GetError(x)));
if (first != null)
{
first.Focus();
return;
}
// Good to go...
}解决方案2: Dictionary
在运行时,为控件及其消息创建一个键值对集合。
private readonly Dictionary<Control, string> dict;
private void someForm_Load(object sender, EventArgs e)
{
dict = new Dictionary<Control, string>()
{
{ CmbParts, "What item to add" },
{ TxtSN, "Define Serial Number" },
{ TxtModule, "Define Module Number" },
// add more...
};
}验证代码。重温2。
private void someButton_Click(object sender, EventArgs e)
{
errorProvider1.Clear();
var cs = GetAllControls(this, true);
string err;
foreach (var c in cs)
{
if (c is TextBox && c.Text.Trim().Length == 0 && dict.TryGetValue(c, out err))
errorProvider1.SetError(c, err);
else if (c is ComboBox cb && cb.SelectedIndex == -1 && dict.TryGetValue(c, out err))
errorProvider1.SetError(c, err);
// else for more types...
}
var first = cs.FirstOrDefault(x => !string.IsNullOrEmpty(errorProvider1.GetError(x)));
if (first != null)
{
first.Focus();
return;
}
// Good to go...
}https://stackoverflow.com/questions/65957577
复制相似问题