none
关于e.cancel RRS feed

  • 问题

  • 你好!
         在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:53

答案

全部回复

  • 不应该啊!我测试过,如果出错,Click事件处理函数是不会执行的!
    你这里好象有问题:
            If Not Regex.IsMatch(TextBox2.Text, "^[a-w]{2}") Then
                ErrorProvider1.SetError(TextBox2, "图书类型名称应由小写字母组成!")
                TextBox2.Focus()
                Return
            Else
    如果出错,直接返回了,也没有设置e.Cancel=true啊!
    周雪峰
    2009年5月2日 8:03
    版主
  • 程序启动后,我的操作步骤是:先在textbox1里输入,程序判断合法后,再在textbox2里输入,然后点击“添加”按钮,程序提示“插入成功!”
    我在单步执行时发现:程序对textbox1进行判断,输入合法后,会直接跳到 按钮的click事件,根本没执行textbox2的验证事件,这是为什么?再麻烦你给看看。
    代码:
    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()

                e.Cancel = True

                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, "图书类型名称应由2位小写字母组成!")
                TextBox2.Focus()

                e.Cancel = True

                Return
            Else
                ErrorProvider1.SetError(TextBox2, "")
            End If

            con.Open()
            Dim cmd1 As New SqlCommand("select * from try where typename='" & 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日 9:25
  • 你在textBox1合法后把焦点放到textBox2上!
    周雪峰
    2009年5月2日 14:29
    版主