none
如何让两个相同的控件的属性值完全相同(自动),谢谢!!! RRS feed

  • 问题

  • 如在两个窗体中各有一个自制控件(Nable),我想当一个窗体中的Nable的所有属性值发生变化时,另一个窗体中的Nable的所有属性值发生也变化,谢谢!!!

    2012年6月8日 14:33

答案

  • 谢谢您!!!可能我的想法没表达清楚,谢谢!!!
    我在以实现我想要的。我发了邮件给您。
    另 :您用的vb2010是从哪下的,我的运行一段时间,就会出现这样那样小问题。如
    附件中的公能在我变得正是软件中却无法实现,只有从新建一个新工程,才能正常。
    谢谢!!!

    另外,我运行你的代码,你貌似根本没有按照我的办法去做啊!我给你的代码你看了没有?!

    另外,你的事件定义呢?


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 YQY888 2012年6月11日 6:47
    2012年6月10日 1:35
    版主

全部回复

  • 【方法一】

    假设有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

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 3:38
    版主
  • 谢谢版主!!!在此学了不少东西,表示感谢!!!

    我要到晚上回家才能调试,到时再请教您,谢谢!!!

    另 我看到下面这段。这个监听是不是一直在进行,只要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,这两种方法的特点你能帮助解释一下好吗,谢谢!!!

    2012年6月9日 4:16
  • 版主:

    Public Event GlobalTextChanged As Action(Of GlobalTextUserControl)
    ‘中GlobalTextUserControl是什么意思,请您见谅,未系统学习过。谢谢!!!

    Public Event GlobalTextChanged As Action(Of GlobalTextUserControl)中GlobalTextUserControl是什么意思,请您见谅,未系统学习过。谢谢!!!

    2012年6月9日 4:28
  • 是一个事件(类似Button——Click)一样,自定义事件。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 4:36
    版主
  • 版主:还请您帮助:我做了两个截图,请您帮助再看看,谢谢!!!

    主窗体:

     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上也加了两个相同控件)

    2012年6月9日 8:50
  • 您是VS2010项目吗?是的话请留下Email(或者点击我的签名),我给你发一个示例项目过去:-)

    从错误当中看貌似GlobalUserControl无法识别,你是否忘记把这个自定义控件拖拽到SubItem窗体上了呢?

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 8:52
    版主
  • 是的,谢谢!!!MSDN165168@YEAH.NET
    2012年6月9日 9:00
  • 是的,谢谢!!!MSDN165168@YEAH.NET

    从错误当中看貌似GlobalUserControl无法识别,你是否忘记把这个自定义控件拖拽到SubItem窗体上了呢?

    另外我已经发送了,请查收,谢谢!


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 9:02
    版主
  • 谢谢!!!收到,我学习一下,谢谢!!!
    2012年6月9日 9:13
  • 谢谢!!!收到,我学习一下,谢谢!!!
    对不起,你应该先标记我的答案。如果有帮助的话,谢谢配合。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 9:15
    版主
  • 版主:不好意思。我添加了一个Newform窗体,上面放了一个GlobalTextUserControl。

    我想SubItem里的随Newform上的变化,该如何改,谢谢!!!

    是不是改下面的:该如何改?

     <summary>
        ' 收到监听的窗体,如主窗体无需设置此属性
             </summary>

    2012年6月9日 9:55
  • 【主窗体】

    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

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 9:58
    版主
  • 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 = Me

            Newform.Show()

        End Sub
    End Class

    2012年6月9日 9:59
  • 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 = Me

            Newform.Show()

        End Sub
    End Class

    已经回答了,你自己重新看。刷新浏览器,谢谢!

    我一个MainItem,一个SubItem,MainItem控制SubItem。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 10:04
    版主
  • 谢谢您!!!不好意思。

    你的两个窗体实际是一个窗体。而我想要的是两个不同窗体,各有不同的控件属性,只是两个窗体中各有一个自制控件(Nable),都是用来表示(调节)同一个参数。如下图两个窗体:

    各有一个FIC108,但两个窗体中的FIC108一起变化,若其中一个被调节了,另一个也一起变化,谢谢!!!

    2012年6月9日 11:16
  • 对不起,我已经做了两个不一样的窗体了,你仔细看了吗?

    【主窗体】
    
    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

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 11:21
    版主
  • 谢谢!!!不好意思。

    我注意到了。问题是新加一个窗体MainItem后。     '监听主窗体是否发生变化了
           
    AddHandler ListeningForm.GlobalTextChanged, New Action(Of GlobalTextUserControl)(AddressOf OnGlobalTextChanged)
    会错。如没有窗体MainItem也会错。您看看:第一幅为没有窗体MainItem的,第二幅为有窗体MainItem的

    2012年6月9日 13:19
  • 斑主:提示:GlobalTextChanged不是vb.MainItem事件
    2012年6月9日 13:31
  • 斑主:提示: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

    另外代码已经重新发了过去:-)


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月9日 23:52
    版主
  • 谢谢!!!可能我的想法有问题,谢谢!!!
    2012年6月10日 1:13
  • 谢谢您!!!可能我的想法没表达清楚,谢谢!!!
    我在以实现我想要的。我发了邮件给您。
    另 :您用的vb2010是从哪下的,我的运行一段时间,就会出现这样那样小问题。如
    附件中的公能在我变得正是软件中却无法实现,只有从新建一个新工程,才能正常。
    谢谢!!!
    2012年6月10日 1:30
  • 您好:)

    请到此处下载VB.NET(完全免费的VS Express版本:http://124.14.8.49/download/4496625/5659184/2/iso/211/9/1275634627795_521/VS2010ExpressCHS.iso)。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月10日 1:34
    版主
  • 谢谢您!!!可能我的想法没表达清楚,谢谢!!!
    我在以实现我想要的。我发了邮件给您。
    另 :您用的vb2010是从哪下的,我的运行一段时间,就会出现这样那样小问题。如
    附件中的公能在我变得正是软件中却无法实现,只有从新建一个新工程,才能正常。
    谢谢!!!

    另外,我运行你的代码,你貌似根本没有按照我的办法去做啊!我给你的代码你看了没有?!

    另外,你的事件定义呢?


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 YQY888 2012年6月11日 6:47
    2012年6月10日 1:35
    版主