(急)一个让我头都大了的问题,求大家帮助,谢谢
本帖最后由 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