【问题标题】:loop through some controls on a form循环遍历表单上的一些控件
【发布时间】:2016-05-01 09:21:05
【问题描述】:

使用 c# win 表单

我有一个包含许多文本框和组合框的表单

其中一些控件 - 不是全部 - 不能为空

如果用户点击保存按钮,我希望空控件的标签变为红色 ....

我试过了

if (cmbNyaba.SelectedIndex == -1)
        {
            lblNyaba.ForeColor = Color.Red;
            return;
        }
        else
        {
            lblNyaba.ForeColor = Color.Black;
        }


if (txtCaseHasr.Text == "")
        {
            lblHasrNum.ForeColor = Color.Red;
            return;
        }
        else
        {
            lblHasrNum.ForeColor = Color.Black;
        }


if (txtCaseNum.Text == "")
        {
            lblCaseNum.ForeColor = Color.Red;
            return;
        }
        else
        {
            lblCaseNum.ForeColor = Color.Black;
        }

但我认为这不是一个好方法

我应该使用标签属性还是什么?

谢谢


我试过了

public static Boolean ValidateControle(Control MyObjet, int oblig = 0)
    {
        ErrorProvider err = new ErrorProvider();

        String mess = "";
        Boolean valid = true;
        if (MyObjet != null)
        {

            if (oblig == 1)
            {

                mess = "Can not be empty !";
            }

            if (MyObjet.Text.Trim().Length == 0) valid = false;

            if (MyObjet is ComboBox)
            {
                ComboBox cmb = (MyObjet as ComboBox);
                if (cmb.SelectedIndex == -1)
                {
                    mess = "Select at least one element !";
                    valid = false;
                }
            }
            if (valid == false)
            {
                err.SetError(MyObjet, mess);
                MyObjet.BackColor = Color.FromArgb(253, 108, 119);
            }
            else
            {                   
                err.SetError(MyObjet, "");
                MyObjet.BackColor = Color.White;
            }

            err.SetIconAlignment(MyObjet, ErrorIconAlignment.MiddleRight);
        }    
        return valid;          
    }


private void btnSave_Click(object sender, EventArgs e)
    {


        if (cmbCaseCrime.SelectedIndex == -1 || 
           cmbMember.SelectedIndex == -1 ||
           cmbCaseType.SelectedIndex == -1 ||
           string.IsNullOrEmpty(txtCaseNum.Text) ||
           string.IsNullOrEmpty(txtCaseHasr.Text))
        {
            ValidateControle(cmbCaseCrime, 1);
            ValidateControle(cmbMember, 1);
            ValidateControle(cmbCaseType, 1);
            ValidateControle(txtCaseHasr, 1);
            ValidateControle(txtCaseNum, 1);

            return;
        }

        string str = btnSave.Text;
        switch (str)
        {
            case "add":

                DataTable dt = new DataTable();
                dt = cs.Verify_CASES(txtCaseNum.Text, txtCaseYear.Text, Convert.ToInt32(cmbCaseType.SelectedValue), Convert.ToInt32(cmbCaseRegion.SelectedValue));
                if (dt.Rows.Count > 0)
                {
                    MessageBox.Show("already added ", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                else
                {
                    ce.ADD_CASE(txtCaseNum.Text, txtCaseHasr.Text, dtp_CaseComingDate.Value, txtCaseYear.Text,
                            Convert.ToInt32(cmbCaseType.SelectedValue),
                            Convert.ToInt32(cmbCaseRegion.SelectedValue),
                            Convert.ToInt32(cmbCaseStatus.SelectedValue),
                            Convert.ToInt32(cmbCaseCrime.SelectedValue),
                            Convert.ToInt32(cmbMember.SelectedValue), txtCaseStatusDate.Text);



                    MessageBox.Show("added successfuly", " ", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    this.txtidCase.Text = ce.GET_LAST_CASE_ID().Rows[0][0].ToString();

                    this.btnAddRemain.Enabled = true;
                    this.cmbCaseRemain.Focus();
                    this.btnSave.Enabled = false;


                }

【问题讨论】:

  • 您在 Windows 窗体中有一些有用的工具来执行验证和显示错误消息,包括: • IDataErrorInfo 接口 • Validating 控件事件 • ErrorProvider 组件 ValidateChildren 方法和 AutoValidate形式的属性。你可能会发现这篇文章很有帮助Validating user input / Give .NET controls status OK or NOK

标签: c# winforms combobox textbox


【解决方案1】:

首先你必须在表单类下将 ErrorProvider 声明为全局并添加一个 void ClearError 为:

     public partial class Form1 : Form
        {
            ErrorProvider err = new ErrorProvider();

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {

            }
  private void ClearError()       
        {

           // ErrorProvider err = new ErrorProvider();

            foreach (Control cn in this.Controls)
            {

                err.SetError(cn,"");

                err.Clear();
                cn.BackColor = Color.White;

            }
        }

您必须将 btnSave_Click 更改为:

private void btnSave_Click(object sender, EventArgs e)
{

        bool test =true ;
    ClearError (); // for clear all mark error in all conrols in the form
     test=   ValidateControle(cmbCaseCrime, 1);
      test=  ValidateControle(cmbMember, 1);
      test=  ValidateControle(cmbCaseType, 1);
       test= ValidateControle(txtCaseHasr, 1);
      test=  ValidateControle(txtCaseNum, 1);

        if (test ==false )
        {
            MessageBox .Show("You have some error !");
        return;
        }

    string str = btnSave.Text;
    switch (str)
    {
        case "add":

            DataTable dt = new DataTable();
            dt = cs.Verify_CASES(txtCaseNum.Text, txtCaseYear.Text, Convert.ToInt32(cmbCaseType.SelectedValue), Convert.ToInt32(cmbCaseRegion.SelectedValue));
            if (dt.Rows.Count > 0)
            {
                MessageBox.Show("already added ", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            else
            {
                ce.ADD_CASE(txtCaseNum.Text, txtCaseHasr.Text, dtp_CaseComingDate.Value, txtCaseYear.Text,
                        Convert.ToInt32(cmbCaseType.SelectedValue),
                        Convert.ToInt32(cmbCaseRegion.SelectedValue),
                        Convert.ToInt32(cmbCaseStatus.SelectedValue),
                        Convert.ToInt32(cmbCaseCrime.SelectedValue),
                        Convert.ToInt32(cmbMember.SelectedValue), txtCaseStatusDate.Text);



                MessageBox.Show("added successfuly", " ", MessageBoxButtons.OK, MessageBoxIcon.Information);

                this.txtidCase.Text = ce.GET_LAST_CASE_ID().Rows[0][0].ToString();

                this.btnAddRemain.Enabled = true;
                this.cmbCaseRemain.Focus();
                this.btnSave.Enabled = false;


            }

我希望能解决您的问题,请投票并标记为已解决。

【讨论】:

  • 对不起...由于某种原因,ClearError 删除了红色背景,但没有清除错误标志
  • 您是否在表格顶部声明了 ErrorProvider,并且您在任何地方都不得有其他声明。我的回答很有帮助,您使用它,但您不投票!
  • 当然......你的回答很有帮助......谢谢
  • 好的,正常情况下,我会进行测试,如果你愿意,它对我有用,我给你我的例子?
  • 我会很感激的
【解决方案2】:

你可以使用这个功能:

    public static Boolean ValidateControle(Control MyObjet, int oblig=0)
    {
        ErrorProvider err=new ErrorProvider ();

        String mess = "";
        Boolean valid = true;
        if (MyObjet != null)
        {

            if (oblig == 1)
            {

                mess = "Can not be empty !";
            }

            if (MyObjet.Text.Trim().Length == 0) valid = false;


            if (MyObjet is ComboBox)
            {
                ComboBox cmb = (MyObjet as ComboBox);
                if (cmb.SelectedIndex == -1)
                {
                    mess = "Select at least one element !";
                    valid = false;
                }
            }


            if (valid == false)
            {
                err.SetError(MyObjet, mess);
                MyObjet.BackColor = Color.FromArgb(253, 108, 119);

            }
            else
            {
                err.SetError(MyObjet, "");
                MyObjet.BackColor = Color.White;
            }

            err.SetIconAlignment(MyObjet, ErrorIconAlignment.BottomRight);
        }
        return valid;
    }

您可以使用 oblig 参数来指定 control 是否可以为空。 在此调用中,您可以通过在第二个参数中传递 1 来指定女巫控制是强制性的 调用函数:

 ValidateControle(textBox1, 1);

   ValidateControle(comboBox1,1);
     ValidateControle(comboBox2,0);

或者:

 foreach ( Control cn in this.Controls )
            {
                ValidateControle(cn);

            }

【讨论】:

  • 还有一个问题......我可以在哪里使用代码的第二部分?第一部分运行良好..让代码继续工作并保存记录..我想在找到空控件时停止保存
  • 它工作了....但是如果我填充其中一个控件并再次尝试错误标志仍然存在...并且其他标志没有闪烁
【解决方案3】:

您可以做的第一件事是使用this.Controls.OfType<T> 查找给定类型的所有控件。 例如,查找哪些标签是空的可能看起来像

var labels = this.Controls.OfType<Label>();
foreach(var label in labels)
if(label.Text == "")
//the actions you want to do.

但是,如果您有一些容器控件,您还必须遍历它们。

您可以尝试的第二种方法是使用ValidatingValidated 事件。

【讨论】:

    【解决方案4】:

    为此,您必须在类中声明您的提供者:

     public partial class Form1 : Form
    
    {
        ErrorProvider err = new ErrorProvider();
    
        public Form1()
        {
            InitializeComponent();
        }
    

    对于测试,你必须记录或不你可以这样做:

     private void button3_Click(object sender, EventArgs e)
            {
               bool test  =true  ;
    
                test= ValidateControle(textBox1, 1);
    
               test= ValidateControle(comboBox1,1);
    
               if (test)
               {
                   //continue working and saving the record
               }
               else
               {
                   //Stop and traancate recording
    
               }
    
            }
    

    为了清除所有错误标志,您可以将 void 声明为:

    private void ClearError()       
            {
    
                foreach (Control cn in this.Controls)
                {
    
                    err.SetError(cn,"");
    
                    err.Clear();
                    cn.BackColor = Color.White;
    
                }
            }
    

    如果你想清除错误标志,你可以调用这个函数。 如果我的回答对您有帮助,请投票并标记为已解决

    【讨论】:

    • 当用户填充其中一个空文本框时..它的背景颜色再次变白..但标志仍然存在于所有控件旁边,包括填充的那个..我想清除它..和保留其他标志..我试图调用该函数,但它不起作用..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多