none
急!!!向大家求个思路!!! RRS feed

  • 问题

  • 窗体上有7个控件:6个textbox,2个datetimepicker,2个combobox.其中1个combobox绑定图书类别.另一个是通过添加item项值添加项.现在对6个textbox,和1个combobox进行vaildating的验证,即随着焦点由当前的控件移到另一个控件上时发生vaildating时间.问题是怎样使所有的控件的 vaildating事件都发生后且errorprovider控件对每个具有验证事件的表达式没报错的情况下,才能通过点"添加"按钮,将信息添加到数据库。

    尝试一:我开始设计时发现,对多个控件添加了验证事件,由于输入时对控件的操作是无序的,所以当最后操作的控件是带有验证事件的话,只有通过点击其他已经输入合法的控件或点击"添加"按钮,来激发验证事件.考虑到通常情况下使用者会点击"添加按钮",所以问题来了:点击按钮后,当最后操作的控件输入不合法时,会在控件旁先显示提示信息,紧接着执行按钮的事件,弹出:"添加操作成功"的对话框,并且将输入不合法的信息一起插入到数据库中.这个问题可怎么解决啊?!请各位高手给个思路!

    尝试二:我是面向过程的设计思想。也考虑过用全局变量,初始声明的f=0,对每个验证事件,在输入正确的情况下执行f加1,最后f=6时“添加”按钮可用,但是若要连续插入下一条信息时,f值此时大于6。怎样使f值清零?

    想了很久仍然没找到解决方法!有些着急!

    2009年4月29日 16:11

答案

  • 最笨最简单的办法就是为每个控件都设置一个变量表示是示波器验证成功,默认让提交 button.Enabled = false; 每次难时判断 6 个变量是否都为 true 如果为 true button.Enabled = true
    知识改变命运,奋斗成就人生!
    2009年4月30日 1:08
    版主
  • 你好!
         在Validating事件的处理函数中,如果验证失败,就将CancelEventArgs 类型的参数e的 Cancel 属性设置为 true ,则正常情况下将在 Validating 事件之后发生的所有事件均被取消。当然,你添加按钮的事件也取消了,例如这样:
             private void textBox1_Validating(object sender, CancelEventArgs e)
            {
                if (this.textBox1.Text == "aaa")
                    e.Cancel = true;
            }
          希望以上解释对你有一些帮助,如果还有疑问,我们可以继续讨论啊!
    周雪峰
    2009年4月30日 5:47
    版主

全部回复

  • 最笨最简单的办法就是为每个控件都设置一个变量表示是示波器验证成功,默认让提交 button.Enabled = false; 每次难时判断 6 个变量是否都为 true 如果为 true button.Enabled = true
    知识改变命运,奋斗成就人生!
    2009年4月30日 1:08
    版主
  • 你好!
         我感觉可以在按钮的Click事件处理程序中加个判断,如果那些控件有一个验证失败,就什么也不做,这时那个最后选择的控件刚好会提示给用户错误信息的!
    周雪峰
    2009年4月30日 3:00
    版主
  • 按照你的建议,将f1,f2,f3,f4,f5,f6设为6个控件的标志位变量,将它们作为全局变量,但是若向数据库添加完一条信息后,连续添加第二条信息,怎样改变全局变量,使6个标志为恢复为false?

    2009年4月30日 3:38
  • 在 ButtonClick 事件处理完保存后,设置嘛 ,

    private bool f1 = false;
    private bool f2 = false;

    void Control1_ Vaildating ..
    {
    if (ok)
    f1 = true;
    else 
    f1 = false;

    }

    void Button_Click(object sender, EventArgs)
    {
    // 保存完成
    //.....

    control1.Text = "";
    control2.Text = "";
    .....

    f1 = false;
    f2 = false;
    .......
    }

    另外也可以不用全局变量

    知识改变命运,奋斗成就人生!
    2009年4月30日 3:51
    版主
  • 你好!
         我感觉可以在按钮的Click事件处理程序中加个判断,如果那些控件有一个验证失败,就什么也不做,这时那个最后选择的控件刚好会提示给用户错误信息的!
    周雪峰
    winform里,怎样写这个代码?我是新手,请见谅!
    2009年4月30日 4:20
  • 你好!
         在Validating事件的处理函数中,如果验证失败,就将CancelEventArgs 类型的参数e的 Cancel 属性设置为 true ,则正常情况下将在 Validating 事件之后发生的所有事件均被取消。当然,你添加按钮的事件也取消了,例如这样:
             private void textBox1_Validating(object sender, CancelEventArgs e)
            {
                if (this.textBox1.Text == "aaa")
                    e.Cancel = true;
            }
          希望以上解释对你有一些帮助,如果还有疑问,我们可以继续讨论啊!
    周雪峰
    2009年4月30日 5:47
    版主
  • 你的建议很好,非常感谢你!

    2009年5月1日 6:19
  • 不好意思,原来是定义变量时写错了,多谢你的帮助!
    2009年5月1日 6:20
  • 你好!
         在Validating事件的处理函数中,如果验证失败,就将CancelEventArgs 类型的参数e的 Cancel 属性设置为 true ,则正常情况下将在 Validating 事件之后发生的所有事件均被取消。当然,你添加按钮的事件也取消了,例如这样:
             private void textBox1_Validating(object sender, CancelEventArgs e)
            {
                if (this.textBox1.Text == "aaa")
                    e.Cancel = true;
            }
          希望以上解释对你有一些帮助,如果还有疑问,我们可以继续讨论啊!
    周雪峰


    请问:按照你的建议我在每个vaildating事件中,当判断输入内容不合法后,就在后面加了e.Cancel = true;
    但是在最后一个文本框的内容被判断为输入不合法后,在点击“添加”按钮,仍然会成功添加这条带有不合法信息的记录,请问这是怎么回事?试图在click事件中添加一个if判断,条件为e.Cancel = false,但是不成功,因为EventArgs的实例对象没有cancel属性。请问怎么改进?

    谢谢!

    2009年5月1日 6:56
  • 不客气啊!
    欢迎常常来这里和大家交流啊!
    周雪峰
    2009年5月1日 6:57
    版主
  • 你好!
         在Validating事件的处理函数中,如果验证失败,就将CancelEventArgs 类型的参数e的 Cancel 属性设置为 true ,则正常情况下将在 Validating 事件之后发生的所有事件均被取消。当然,你添加按钮的事件也取消了,例如这样:
             private void textBox1_Validating(object sender, CancelEventArgs e)
            {
                if (this.textBox1.Text == "aaa")
                    e.Cancel = true;
            }
          希望以上解释对你有一些帮助,如果还有疑问,我们可以继续讨论啊!
    周雪峰

    按照上面的建议,运行改后的代码,仍然是在报错的同时,执行click事件,插入信息,这是怎么回事?
    程序执行顺序:1。先将两个文本框输入值,不分先后。2。点击按钮,执行click  事件。
    我改后的代码为:麻烦帮忙看看,实在不知道是哪里的问题?
     Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
            If Not Regex.IsMatch(TextBox1.Text, "^\s*\d{2}\s*$") Then
                ErrorProvider1.SetError(TextBox1, "图书类型编号应由2位数字组成!")
                TextBox1.Focus()
                Return
            Else
                ErrorProvider1.SetError(TextBox1, "")
            End If

            con.Open()
            Dim cmd1 As New SqlCommand("select * from try where typeno='" & Me.TextBox1.Text.Trim() & "'", con)
            Dim reader As SqlDataReader
            reader = cmd1.ExecuteReader()
            If (reader.Read()) Then
                ErrorProvider1.SetError(TextBox1, "此编号已存在,请重新输入!")
                TextBox1.Focus()

                e.Cancel = True

            Else
                ErrorProvider1.SetError(TextBox1, "")
            End If
            con.Close()
        End Sub

        Private Sub TextBox2_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
            If Not Regex.IsMatch(TextBox2.Text, "^[a-w]{2}") Then
                ErrorProvider1.SetError(TextBox2, "图书类型名称应由小写字母组成!")
                TextBox2.Focus()
                Return
            Else
                ErrorProvider1.SetError(TextBox2, "")
            End If

            con.Open()
            Dim cmd1 As New SqlCommand("select * from try where bname='" & Me.TextBox2.Text.Trim() & "'", con)
            Dim reader As SqlDataReader
            reader = cmd1.ExecuteReader()
            If (reader.Read()) Then
                ErrorProvider1.SetError(TextBox2, "此编号已存在,请重新输入!")
                TextBox2.Focus()
                e.Cancel = True
            Else
                ErrorProvider1.SetError(TextBox2, "")
                'f2 = True
            End If
            con.Close()
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            con.Open()
            Dim cmd1 As New SqlCommand("insert into try values('" & TextBox1.Text & "','" & TextBox2.Text & "')", con)
            cmd1.ExecuteNonQuery()
            MsgBox("添加操作成功!", 64, "提示")
            con.Close()
            TextBox1.Text = ""
            TextBox2.Text = ""
        End Sub

    2009年5月2日 7:37
  • 你的代码有问题,我在另外的帖子里给你回复了!
    周雪峰
    2009年5月2日 8:05
    版主