首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

(急)一个让小弟我头都大了的有关问题,求大家帮助,多谢

2013-11-04 
(急)一个让我头都大了的问题,求大家帮助,谢谢本帖最后由 lghyf 于 2013-10-28 15:18:00 编辑Private Sub R

(急)一个让我头都大了的问题,求大家帮助,谢谢
本帖最后由 lghyf 于 2013-10-28 15:18:00 编辑     Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
        MsgBox("1")
        RichTextBox2.Text = "1"


    End Sub

    Private Sub RichTextBox2_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox2.TextChanged
        MsgBox("2")
        RichTextBox1.Text = "2"


    End Sub
为什么不能一直循环下去,执行了RichTextBox1.Text = "2"后,就不激活RichTextBox1的TextChanged了,如果我想它们一直循环执行下去,怎么办?
[解决办法]
vb内部有避免产生此状况的机制。
[解决办法]
TextChanged事件发生在值改变之后。赋值并非意味改变。
若RichTextBox1.Text <> "2"时,RichTextBox1.Text = "2"会引发RichTextBox1_TextChanged。
但下次就不会了。因为RichTextBox1.Text = "2"。
[解决办法]
例如,初始两个文本框都是空。你向RichTextBox1随便输入个什么,比如“0”。
1.RichTextBox1_TextChanged引发。
2.执行RichTextBox2.Text = "1"前RichTextBox2.Text值为""
3.RichTextBox2.Text = "1"引发RichTextBox2_TextChanged
4.执行RichTextBox1.Text = "2"前RichTextBox1.Text值为"0"
5.RichTextBox1_TextChanged引发。
6.执行RichTextBox2.Text = "1"前RichTextBox2.Text值为"1"(第3步)
此时,由于RichTextBox2.Text = "1"不会引发值的改变,不会再引发RichTextBox1_TextChanged了。
如果你想写一个死循环。你可以:

Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
         MsgBox("1")
         IF RichTextBox2.Text = "1" Then
             RichTextBox2_TextChanged(RichTextBox2,null)
         Else
             RichTextBox2.Text = "1"
         End If
End Sub

Private Sub RichTextBox2_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox2.TextChanged
         MsgBox("2")
         IF RichTextBox1.Text = "2" Then
             RichTextBox1_TextChanged(RichTextBox2,null)
         Else
             RichTextBox1.Text = "2"
         End If
End IF
[解决办法]
应该是    drowsihead 对的  

u012592437 你可以试一下  RichTextBox1.Text = RichTextBox1.Text + CStr(1)  也不会无限循环下去
[解决办法]
刚才试验了一下RichTextBox确实无法循环引发事件。
不过这绝对不是“vb内部有避免产生此状况的机制”应该是RichTextBox特性。
因为换成TextBox,就会循环引发下去了。
[解决办法]
比如这段代码:
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

        MsgBox("1")
        TextBox2.Text = TextBox2.Text + "!"
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged

        MsgBox("2")
        TextBox1.Text = TextBox1.Text + "!"
    End Sub
[解决办法]
抽了一点时间帮你写了一个新的RichTextBox控件。能完全满足你的需求。
Public Class UserRichTextBox
    Inherits RichTextBox
    Public Event UserTextChange()
    Dim re As Boolean = True



    Private Sub myBase_TextChange(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.TextChanged
        If re Then
            RaiseEvent UserTextChange()
        End If

    End Sub


    Public Overrides Property Text() As String


        Get
            Return MyBase.Text
        End Get
        Set(ByVal value As String)
            If MyBase.Text <> value Then
                re = False
                MyBase.Text = value
                re = True
                RaiseEvent UserTextChange()
            End If
        End Set
    End Property
End Class

=============
使用上面的UserRichTextBox代替系统的RichTextBox
使用UserTextChange事件代替系统的TextChange事件即可。
下面代码能陷入无限循环
    Private Sub UserRichTextBox1_UserTextChange() Handles UserRichTextBox1.UserTextChange
        MsgBox("1")
        UserRichTextBox2.Text = UserRichTextBox2.Text + "!"
    End Sub

    Private Sub UserRichTextBox2_UserTextChange() Handles UserRichTextBox2.UserTextChange
        MsgBox("2")
        UserRichTextBox1.Text = UserRichTextBox1.Text + "!"
    End Sub

热点排行