首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ErrorProvider中创建c#数组

在ErrorProvider中创建c#数组
EN

Stack Overflow用户
提问于 2021-01-29 15:47:20
回答 1查看 95关注 0票数 0

当其中一个字段不为空时,我试图显示错误.用旧的方式一次只做一个领域是费时费力的.那么,是否有一种方法可以创建一个ErrorProvider数组来处理这个问题?

添加项的GUI

这是我到现在为止的密码。

代码语言:javascript
复制
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);
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-30 09:43:40

如前所述,您只需要一个ErrorProvider组件来报告错误。ErrorProvider实现了IExtenderProvider接口,以扩展容器中的控件,并提供其他属性,即ErrorIconAlignmentIconPadding提供者属性。因此,您只需要通过专用的setter/getter方法设置/获取它们的值。

在您的示例中,创建一个获取控件的方法:

代码语言:javascript
复制
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>();
}

并按以下方式验证这些条目:

代码语言:javascript
复制
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,而不是将一个实例放到设计器中,那么您也应该处理它。

代码语言:javascript
复制
private void someForm_FormClosed(object sender, FormClosedEventArgs e)
{
    errorProviderCreatedByCode.Dispose();
}

我在您的代码片段中看到,您需要设置不同的Error消息。在这种情况下,您需要以某种方式将控件与其消息链接。

解决方案1: Control.Tag

在设计时为每个控件设置Tag属性以存储Error值。

验证代码。再看一遍。

代码语言:javascript
复制
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

在运行时,为控件及其消息创建一个键值对集合。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65957577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档