积极答复者
如何让两个相同的控件的属性值完全相同(自动),谢谢!!!

问题
答案
全部回复
-
-
【方法一】
假设有A和B两个窗体,分别有自定义控件,那么为A定义一个自定义构造函数,传入B窗体类型。然后这样做:
我做了一个父子界面的窗体,其中主窗体控制子窗体,且主窗体和子窗体是同一个窗体,只不过是New出来的实体。如果你是不同的窗体,请自行参照代码变更,我只是一个示例!
【自定义控件】
【主窗体代码】
Public Class MainForm Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load '主窗体 Dim mf As New SubItem mf.MdiParent = Me mf.Text = "主窗体" mf.Show()
'自动打开SubForm,并且监听主窗体 Dim sf As New SubItem(mf) sf.MdiParent = Me sf.Show() sf.Text = "子窗体" End Sub End Class
【SubForm窗体】
Public Class SubItem ''' <summary> ''' 收到监听的窗体,如主窗体无需设置此属性 ''' </summary> ''' <remarks></remarks> Private ListeningForm As SubItem = Nothing ''' <summary> ''' 统一对外事件,实现本窗体TextBox改变,其余属性一律自动改变 ''' </summary> Public Event GlobalTextChanged As Action(Of GlobalTextUserControl) Private Sub SubItem_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load If (ListeningForm Is Nothing) Then ''绑定TextBox事件 AddHandler Me.GlobalTextUserControl1.TextBox1.TextChanged, AddressOf RaiseEventChanged ''绑定CheckBox事件 AddHandler Me.GlobalTextUserControl1.CheckBox1.Click, AddressOf RaiseEventChanged End If End Sub Public Sub New() InitializeComponent() End Sub Public Sub New(sfrm As SubItem) InitializeComponent() ListeningForm = sfrm '监听主窗体是否发生变化了 AddHandler ListeningForm.GlobalTextChanged, New Action(Of GlobalTextUserControl)(AddressOf OnGlobalTextChanged) End Sub Private Sub OnGlobalTextChanged(g As GlobalTextUserControl) Me.GlobalTextUserControl1.TextBox1.Text = g.TextBox1.Text Me.GlobalTextUserControl1.CheckBox1.Checked = g.CheckBox1.Checked End Sub Private Sub RaiseEventChanged(sender As Object, args As EventArgs) RaiseEvent GlobalTextChanged(Me.GlobalTextUserControl1) End Sub End Class
- 已编辑 ThankfulHeartModerator 2012年6月9日 3:39 添加图片
-
谢谢版主!!!在此学了不少东西,表示感谢!!!
我要到晚上回家才能调试,到时再请教您,谢谢!!!
另 我看到下面这段。这个监听是不是一直在进行,只要MainForm里的TextBox1发生变化,就能改变SubForm里的TextBox1。
Public Sub New(sfrm As SubItem)
InitializeComponent()
ListeningForm = sfrm
'监听主窗体是否发生变化了
AddHandler ListeningForm.GlobalTextChanged, New Action(Of GlobalTextUserControl)(AddressOf OnGlobalTextChanged)
End Sub
我用一个time控件来监听一个TextBox1的值变化,根据这个值来画一矩形,现在是不是可以用你的这种方法来代替timer,这两种方法的特点你能帮助解释一下好吗,谢谢!!!
-
版主:还请您帮助:我做了两个截图,请您帮助再看看,谢谢!!!
主窗体:
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '主窗体 Dim mf As New SubItem mf.MdiParent = Me mf.Text = "主窗体" mf.Show() '自动打开SubForm,并且监听主窗体 Dim sf As New SubItem(mf) sf.MdiParent = Me sf.Show() sf.Text = "子窗体" End Sub
SubItem上加了textbox1.CheckBox1两个控件(MainForm上也加了两个相同控件)
- 已标记为答案 ThankfulHeartModerator 2012年6月9日 9:02
- 取消答案标记 ThankfulHeartModerator 2012年6月9日 9:02
-
您是VS2010项目吗?是的话请留下Email(或者点击我的签名),我给你发一个示例项目过去:-)
从错误当中看貌似GlobalUserControl无法识别,你是否忘记把这个自定义控件拖拽到SubItem窗体上了呢?
- 已编辑 ThankfulHeartModerator 2012年6月9日 8:55 补充回答
-
是的,谢谢!!!MSDN165168@YEAH.NET
-
是的,谢谢!!!MSDN165168@YEAH.NET
从错误当中看貌似GlobalUserControl无法识别,你是否忘记把这个自定义控件拖拽到SubItem窗体上了呢?
另外我已经发送了,请查收,谢谢!
-
【主窗体】
Public Class MainForm Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load '主窗体 Dim mf As New MainItem mf.MdiParent = Me mf.Text = "主窗体" mf.Show() '自动打开两个SubForms,并且监听主窗体 Dim sf As New SubItem(mf) sf.MdiParent = Me sf.Show() sf.Text = "子窗体" End Sub End Class
【子窗体】
Imports System.Reflection Public Class SubItem ''' <summary> ''' 收到监听的窗体,如主窗体无需设置此属性 ''' </summary> ''' <remarks></remarks> Private ListeningForm As MainItem = Nothing Public Sub New() InitializeComponent() End Sub Public Sub New(mfrm As MainItem) InitializeComponent() ListeningForm = mfrm '监听主窗体是否发生变化了 AddHandler ListeningForm.GlobalTextChanged, New Action(Of GlobalTextUserControl)(AddressOf OnGlobalTextChanged) End Sub Private Sub OnGlobalTextChanged(g As GlobalTextUserControl) Me.GlobalTextUserControl1.TextBox1.Text = g.TextBox1.Text Me.GlobalTextUserControl1.CheckBox1.Checked = g.CheckBox1.Checked End Sub End Class
- 已编辑 ThankfulHeartModerator 2012年6月9日 10:03
-
Public Class MainForm
Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
SubItem.MdiParent = Me
SubItem.Show()
Newform.MdiParent = MeNewform.Show()
End Sub
End Class已经回答了,你自己重新看。刷新浏览器,谢谢!
我一个MainItem,一个SubItem,MainItem控制SubItem。
-
对不起,我已经做了两个不一样的窗体了,你仔细看了吗?
【主窗体】 Public Class MainForm Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load '主窗体 Dim mf As New MainItem mf.MdiParent = Me mf.Text = "主窗体" mf.Show() '自动打开两个SubForms,并且监听主窗体 Dim sf As New SubItem(mf) sf.MdiParent = Me sf.Show() sf.Text = "子窗体" End Sub End Class 【子窗体】 Imports System.Reflection Public Class SubItem ''' <summary> ''' 收到监听的窗体,如主窗体无需设置此属性 ''' </summary> ''' <remarks></remarks> Private ListeningForm As MainItem = Nothing Public Sub New() InitializeComponent() End Sub Public Sub New(mfrm As MainItem) InitializeComponent() ListeningForm = mfrm '监听主窗体是否发生变化了 AddHandler ListeningForm.GlobalTextChanged, New Action(Of GlobalTextUserControl)(AddressOf OnGlobalTextChanged) End Sub Private Sub OnGlobalTextChanged(g As GlobalTextUserControl) Me.GlobalTextUserControl1.TextBox1.Text = g.TextBox1.Text Me.GlobalTextUserControl1.CheckBox1.Checked = g.CheckBox1.Checked End Sub End Class
-
斑主:提示:GlobalTextChanged不是vb.MainItem事件
您好,尝试这样修改(非常抱歉,主窗体是MainItem)
Public Class MainItem ''' <summary> ''' 统一对外事件,实现本窗体TextBox改变,其余属性一律自动改变 ''' </summary> Public Event GlobalTextChanged As Action(Of GlobalTextUserControl) Private Sub MainItem_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load ''绑定TextBox事件 AddHandler Me.GlobalTextUserControl1.TextBox1.TextChanged, AddressOf RaiseEventChanged ''绑定CheckBox事件 AddHandler Me.GlobalTextUserControl1.CheckBox1.Click, AddressOf RaiseEventChanged End Sub Private Sub RaiseEventChanged(sender As Object, args As EventArgs) RaiseEvent GlobalTextChanged(Me.GlobalTextUserControl1) End Sub End Class
另外代码已经重新发了过去:-)