windowsForm程序中,关于窗体控件接收信息的响应等问题~!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windowsForm程序中,关于窗体控件接收信息的响应等问题~!相关的知识,希望对你有一定的参考价值。

各位大哥大姐:
本人初学.NET,遇到一个问题想了半个月都没有想明白。特来请教!
实际的问题很复杂,我写了一个测试程序。实现的功能是需要不停的向窗体里面的Textbox文本框里面写数据(文字信息)。这些信息是分别由两个类反馈回来的。简言之就是,假设有一个Textbox文本框T,一个类A、一个类B。在主线程的Form里面调用类A,A获得一些信息后写入T,当A满足一些条件后调用类B(启动一个新线程),B收集一些信息后写入T文本框。结束一轮循环。现在的问题是B收集信息后无法写入T。
大家还是看我写的测试程序吧!
窗体代码:
Public Class FrmIndex
Delegate Sub UpdateUIdelegate(ByVal str As String)
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim oneStart As New OneCls
AddHandler oneStart.TestShowComplete, AddressOf UpdateUI
Dim t1 As Threading.Thread
t1 = New Threading.Thread(AddressOf oneStart.TestShow)
t1.IsBackground = True
t1.Start()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click /*程序开始按钮
Button1.Enabled = False
Timer1.Enabled = True
Timer1.Interval = 2000
End Sub
Public Sub UpdateUI(ByVal text As String)
If TextBox1.InvokeRequired = False Then
TextBox1.AppendText(text & Chr(10))
Else
Dim d As New UpdateUIdelegate(AddressOf UpdateUI)
'BeginInvoke(d, New Object() text & Chr(10))
Invoke(d, New Object() text & Chr(10))
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click //*程序结束按钮
Button1.Enabled = True
Timer1.Enabled = False
End Sub
End Class
类A:
Public Class OneCls
Public Event TestShowComplete(ByVal str As String)
Public Sub TestShow(ByVal x As Integer)
Dim ran As New Random
Dim i As Integer = ran.Next(1, 100)
Dim sum As Integer = i + x
If sum > 50 Then
RaiseEvent TestShowComplete("居然大于50啊?")
Dim ShowStr As New OutCls
Dim t2 As Threading.Thread /*这里启用新线程调用类B
t2 = New Threading.Thread(AddressOf ShowStr.OutStr)
t2.Start()
Threading.Thread.Sleep(1000)
Else
RaiseEvent TestShowComplete("终于小于50啦")
Threading.Thread.Sleep(1000)
RaiseEvent TestShowComplete(Chr(10))
End If
End Sub
类B:(主要代码,提问也还有字数限制的,郁闷)
Public Event OutStrComplete(ByVal text As String)
Public Sub OutStr()
Dim str As String() = "AAAA", "BBBB", "CCCC", "DDDD", "1234"
Dim Outstring As String = Nothing
For Each Outstring In str
'RaiseEvent OutStrComplete(Outstring)
'FrmIndex.TextBox1.AppendText(Outstring & Space(2))关键就是这里如何向窗体界面的文本框TextBox1输入信息!
Next
End Sub
pengxin2008说的,我很早就想到了,刚到实验了下。还是不行!

TextBox组件使用虽然比较简单,但TextBox类的构成成员却是非常的丰富。在一般性的编程中,主要涉及到三类:属性、方法和事件。表01、表02和表03分别是TextBox类的常用属性、方法和事件及其简单说明。
属性说明AcceptsReturn指示在多行TextBox组件中按ENTER键时,是在组件中创建一行新文本还是激活窗体的默认按钮。AcceptsTab该值指示在多行文本框组件中按TAB键时,是否在组件中键入一个TAB字符,而不是按选项卡的顺序将焦点移动到下一个组件。AllowDrop 获取或设置一个值,该值指示组件是否可以接受用户拖放到它上面的数据。Anchor获取或设置组件的哪些边缘锚定到其容器边缘。BackColor 获取或设置组件的背景色。BackgroundImage获取或设置在组件中显示的背景图像。BorderStyle获取或设置文本框组件的边框类型。Bottom 获取组件的下边缘与其容器的工作区的上边缘之间的距离。CanFocus 获取一个值,该值指示组件是否可以接收焦点。CanSelect 获取一个值,该值指示是否可以选中组件。CanUndo获取一个值,该值指示用户在文本框组件中能否撤消前一操作。CharacterCasing获取或设置TextBox组件是否在字符键入时修改其大小写格式。ContextMenu 获取或设置与组件关联的快捷菜单。Reated 获取一个值,该值指示组件是否已经创建。Cursor 获取或设置当鼠标指针位于组件上时显示的光标。DataBindings 为该组件获取数据绑定。Dock获取或设置组件停靠到父容器的哪一个边缘。Enabled 获取或设置一个值,该值指示组件是否可以对用户交互作出响应。Focused获取一个值,该值指示组件是否有输入焦点。Font获取或设置组件显示的文字的字体。ForeColor获取或设置组件的前景色。MaxLength获取或设置用户可以在文本框组件中最多键入的字符数。MultilineTRUE/FALSE,该值指示它是否为多行文本框组件。PasswordChar获取或设置字符,该字符用于屏蔽单行ScrollBars获取或设置哪些滚动条应出现在多行TextBox 组件中。Text获取或设置文本框中的当前文本。TextAlign设置文本框内文本得对齐方式TextLength 获取组件中文本的长度。
表01:TextBox类的常用属性及其说明
方法说明AppendText 向文本框的当前文本追加文本。Clear从文本框控件中清除所有文本。ClearUndo从该文本框的撤消缓冲区中清除关于最近操作的信息。Copy 将文本框中的当前选定内容复制到剪贴板。Cut将文本框中的当前选定内容移动到剪贴板中。DoDragDrop 开始拖放操作。Focus 为控件设置输入焦点。GetChildAtPoint检索位于指定坐标处的子控件。GetNextControl按照子控件的Tab键顺序向前或向后检索下一个控件。Hide对用户隐藏控件。Paste用剪贴板的内容替换文本框中的当前选定内容。PointToClient将指定屏幕点的位置计算成工作区坐标。PointToScreen将指定工作区点的位置计算成屏幕坐标。ResetBindings 将DataBindings属性重置为其默认值。Select 选择控件中的文本。SelectAll 选定文本框中的所有文本。SelectNextControl 激活下一个控件。Show向用户显示控件。SuspendLayout临时挂起控件的布局逻辑。Undo撤消文本框中的上一个编辑操作。 表02:TextBox类的常用方法及其说明
事件说明Click在单击文本框时发生。CursorChanged 当 Cursor 属性的值更改时发生。DoubleClick在双击控件时发生。DragDrop 在完成拖放操作时发生。DragEnter在将对象拖入控件的边界时发生。DragLeave在将对象拖出控件的边界时发生。DragOver 在将对象拖到控件的边界上发生。EnabledChanged Enabled 属性值更改后发生。Enter进入控件时发生。GiveFeedback在执行拖动操作期间发生。GotFocus在控件接收焦点时发生。KeyDown在控件有焦点的情况下按下键时发生。KeyPress在控件有焦点的情况下按下键时发生。KeyUp 在控件有焦点的情况下释放键时发生。Leave 在输入焦点离开控件时发生。LostFocus当控件失去焦点时发生。MouseDown 当鼠标指针位于控件上并按下鼠标键时发生。MouseEnter在鼠标指针进入控件时发生。MouseHover在鼠标指针悬停在控件上时发生。MouseLeave 在鼠标指针离开控件时发生。MouseMove 在鼠标指针移到控件上时发生。MouseUp 在鼠标指针在控件上并释放鼠标键时发生。MouseWheel在移动鼠标轮并且控件有焦点时发生。Move 在移动控件时发生。Paint 在重绘控件时发生。Resize 在调整控件大小时发生。RichTextBox控件可以打开和保存RTF文件或普通的ASCII文本文件。你可以使用控件的方法(LoadFile和SaveFile)直接读和写文件,或者在Visual Basic的文件输入/输出语句中使用控件的属性如SelRTF和TextRTF等。 RichTextBox控件使用OLEObjects集合支持嵌入的对象。每个嵌入控件中的对象都表示为一个OLEObject对象。这允许文档中创建的控件可以包含其他控件或文档。例如,可以创建一个包含Microsoft Excel报表、Microsoft Word文档或任何在系统中注册的其他OLE对象的文档。要在RichTextBox控件中插入对象,可以简单地拖住一个文件(如使用Windows 95的Explorer)或其他应用程序(如Microsoft Word)中所用文件的加亮部分(选择部分),将其直接放到该RichTextBox控件上。 RichTextBox控件支持剪贴板和OLE对象的OLE拖放功能。当从剪贴板粘贴对象时,就在当前的插入点插入该对象。如果对象是拖放到控件中,则插入点将跟随鼠标指针位置变动,直到释放开鼠标,然后在鼠标释放处插入对象。 要打印RichTextBox控件中的所有或部分文本,使用SelPrint方法。因为RichTextBox控件是数据绑定控件,可以将其与Data控件绑定到Microsoft Access数据库的Binary或Memo数据域,或其他数据库中类似的数据域(如SQL Server中的TEXT数据类型的数据域)。 RichTextBox控件支持几乎所有的TextBox控件中的属性、事件和方法,如MaxLength, MultiLine, ScrollBars, SelLength, SelStart和SelText。使用TextBox控件的应用程序很容易改为使用RichTextBox控件。然而,RichTextBox控件并没有普通TextBox控件的64K字符能力的限制。 属性 Appearance属性(ActiveX控件),BackColor,ForeColor属性(ActiveX控件),BorderStyle属性(ActiveX控件),Enabled属性(ActiveX控件),HideSelection属性(ActiveX控件),MousePointer属性(ActiveX控件),OLEDragMode属性(ActiveX控件),OLEDropMode属性(ActiveX控件),SelLength, SelStart,SelText属性(ActiveX控件),Text属性(ActiveX控件),Height,Width属性(ActiveX控件),Index属性(ActiveX控件),Left, Top属性(ActiveX控件),Tag属性(ActiveX控件),Visible属性(ActiveX控件),Object属性(ActiveX控件),DisableNoScroll属性,SelHangingIndent, SelIndent, SelRightIndent属性,BulletIndent属性,SelAlignment属性,SelBold, SelItalic, SelStrikethru, SelUnderline属性,SelCharOffset属性,SelColor属性,SelFontName属性,SelFontSize属性,SelBullet属性,SelTabCount,SelTabs属性,SelRTF属性,RightMargin属性,AutoVerbMenu属性(RichTextBox控件),SelProtected属性,MaxLength属性(RichTextBox控件),MultiLine属性(RichTextBox控件),ScrollBars属性(RichTextBox控件),OLEObjects属性,DataChanged属性,DataField属性,FileName属性(RichTextBox控件),TextRTF属性,AutoVerbMenu属性(RichTextBox控件),Top属性,DataMember属性,DataFormat属性,DataBindings属性,TabIndex属性,DragIcon属性,DragMode属性,hWnd属性,Locked属性,Causes Validation属性,MouseIcon属性,TabStop属性,HelpContextID属性,Name属性,Parent属性,Font属性,Container属性,ToolTipText属性,DataSource属性,WhatsThisHelpID属性。 方法 OLEDrag方法(ActiveX控件),Refresh方法(ActiveX控件),Find方法,GetLineFromChar方法,LoadFile方法,SaveFile方法,SelPrint方法,Span方法,Upto方法,SetFocus方法,Drag方法,Move方法,ZOrder方法,ShowWhatsThis方法。 事件 SelChange事件,DragDrop事件,DragOver事件,GotFocus事件,KeyDown,KeyUp事件,KeyPress事件,LostFocus事件,MouseDown, MouseUp事件,MouseMove事件,Validate事件,OLECompleteDrag事件(ActiveX控件),OLEDragDrop事件(ActiveX控件),OLEDragOver事件(ActiveX控件),OLEGiveFeedback事件(ActiveX控件),OLESetData事件(ActiveX控件),OLEStartDrag事件(ActiveX控件),Change事件(ActiveX控件),Click事件(ActiveX控件),DblClick事件(ActiveX控件),KeyDown,KeyUp事件(ActiveX控件),KeyPress事件(ActiveX控件)。
参考技术A Public Class FrmIndex

Delegate Sub UpdateUIdelegate(ByVal str As String)
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim oneStart As New OneCls(1) '构造时传参数
AddHandler oneStart.TestShowComplete, AddressOf UpdateUI
Dim t1 As Threading.Thread
'Dim state As Object
'Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf oneStart.TestShow), state)
t1 = New Threading.Thread(AddressOf oneStart.TestShow)'此处不能有参数
t1.IsBackground = True
t1.Start()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click '程序开始按钮
Button1.Enabled = False
Timer1.Enabled = True
Timer1.Interval = 2000
End Sub
Public Sub UpdateUI(ByVal text As String)
If TextBox1.InvokeRequired = False Then
TextBox1.AppendText(text & Chr(10))
Else
Dim d As New UpdateUIdelegate(AddressOf UpdateUI)
'BeginInvoke(d, New Object() text & Chr(10))
Invoke(d, New Object() text & Chr(10))
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) '*程序结束按钮
Button1.Enabled = True
Timer1.Enabled = False
End Sub
End Class

Public Class OneCls
Private x As Integer
Public Sub New(ByVal xpara As Integer)
x = xpara
End Sub
Public Event TestShowComplete(ByVal str As String)
Public Sub TestShow() 'ByVal x As Integer)
'Public Sub TestShow(ByVal x As Object)
Dim xtemp As Integer = x
Dim ran As New Random
Dim i As Integer = ran.Next(1, 100)
Dim sum As Integer = i + x
If sum > 50 Then
RaiseEvent TestShowComplete("居然大于50啊?")
Dim ShowStr As New OutCls
Dim t2 As Threading.Thread '这里启用新线程调用类B
t2 = New Threading.Thread(AddressOf ShowStr.OutStr)
t2.Start()
Threading.Thread.Sleep(1000)
Else
RaiseEvent TestShowComplete("终于小于50啦")
Threading.Thread.Sleep(1000)
RaiseEvent TestShowComplete(Chr(10))
End If
End Sub
End Class

'类B:(主要代码,提问也还有字数限制的,郁闷)
Public Class OutCls
Public Event OutStrComplete(ByVal text As String)
Public Sub OutStr()
Dim str As String() = "AAAA", "BBBB", "CCCC", "DDDD", "1234"
Dim Outstring As String = Nothing
For Each Outstring In str
'RaiseEvent OutStrComplete(Outstring)
FrmIndex.TextBox1.AppendText(Outstring & Space(2)) '关键就是这里如何向窗体界面的文本框TextBox1输入信息!
Next
End Sub
End Class
参考技术B 直接把 private System.Windows.Forms.TextBox textBox1;
设置成 public System.Windows.Forms.TextBox textBox1;

另一个窗体也能访问了

以上是关于windowsForm程序中,关于窗体控件接收信息的响应等问题~!的主要内容,如果未能解决你的问题,请参考以下文章

WindowsForm多窗体多窗体传值控件数据绑定--12月8日

.NET的.NET控件

按名称在 Windows 窗体中查找控件

WinForm 窗体属性 窗体美化

在 C# windows 窗体中制作的保存/加载控件

WindowsForm窗体位置