none
關於 新增 方法 問題 RRS feed

  • 問題

  • HI~是這樣的。

    假設,我有個 UserControl ,裡面新增了個屬性叫:(純粹記錄這 Form是什麼)

    private _link as integer
    Public Property Link As Object
    
        Get
            '.......
        End Get
    
         Set
             '.......
         End Set
    
    End Property

    我想當 Form 不存在時,會自動變色。

    我想到2個方法

    (1)我把偵測部份寫在Timmer中,但有多個UserControl時,感覺不良好,好像會吃很多資源。

    (2)我把 偵測(If Obj.Creative=false then ) 寫在屬性的Get中,把工作 (If_link=?then UserControl.backcolor = red )寫在 Set中。

        問題出現:但性質只限 Object,不能用在Form上 ( Public Property Link As Form ) ,如果寫了,下面(return)就會出現錯誤。

        所以,我打算寫在方法入面。好像 UserControl_mousedown 那種。

    我想要一個 UserControl_LinkStateChange。但我不會弄這個。

    求更好的解決方法。


    2016年2月18日 上午 07:42

解答

  • 你要在 UserControl 自訂事件 ? (老實說, 除非你要讓另一個東西去監聽各個 UserControl 的變化, 不然 UserControl 自己掛個事件的意義不太存在, 重點不是怎麼寫, 而是寫出來的意義是甚麼?)

     Events (Visual Basic)

    問題是, 你還是要監聽那些被管理的 Form 的 Load 和 Closed 啊, 不然 UserControl 怎麼知道 Form 的狀態 ?

    補充: 我相信你一定沒看懂我在寫甚麼, 建議你先弄懂我之前寫的程式碼, 加上一些更動應該就可以符合你的情境.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年2月22日 上午 04:30
    版主

所有回覆

  • 可否仔細解釋一下你想做甚麼樣的功能 ? 這樣會比較好找方案

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月18日 上午 09:47
    版主
  • 很難理解你要的是什麼欸?
    2016年2月18日 下午 12:30
  • 有考慮過用 My.Application.OpenForms 去列舉嗎?

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年2月18日 下午 12:53

  • 2016年2月19日 上午 06:50
  • Property 的型別只能寫 Object 這檔事不合理啊, 完全測不出來這樣的狀況.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月19日 上午 09:14
    版主
  • 所以,只能在 form1 Timmer內,每秒找 form2是否存在?

    能不能在UserControl內,

    新增一個叫 UserControl_LinkFormState 的東西,就像UserControl_MouseDown的東西。

    UserControl_MouseDown → 滑鼠按下才執行程式碼

    UserControl_LinkFormState → 當連結的Form(f即orm2) 開啟 / hide / close 才執行程式碼

    2016年2月20日 上午 03:53
  • 這有很多種變化, 但總之使用 Timer 是鐵死的, 以下是一種基本型

    UserControl

    Public Class StatusUserControl
        Sub New()
    
            ' 此為設計工具所需的呼叫。
            InitializeComponent()
    
            ' 在 InitializeComponent() 呼叫之後加入任何初始設定。
            _defaultBackgroundColor = Color.Yellow
            _formShownBackgroundColor = Color.Red
            Me.BackColor = _defaultBackgroundColor
        End Sub
    
        Private _defaultBackgroundColor
        Private _formShownBackgroundColor
        Private _myForm As Form
        Public Property MyForm As Form
            Get
                Return _myForm
            End Get
            Set(value As Form)
                If value IsNot _myForm Then
                    CheckMyFormSetterValue(value)
                    _myForm = value
                End If
            End Set
        End Property
        Private Sub CheckMyFormSetterValue(value As Form)
            If value Is Nothing Then
                SetMyFormToNothing(value)
            Else
                SetMyFormToAnotherForm(value)
            End If
        End Sub
    
        Private Sub SetMyFormToNothing(value As Form)
            SetPreMyForm()
        End Sub
    
        Private Sub SetMyFormToAnotherForm(value As Form)
            SetPreMyForm()
            AddHandler value.Load, AddressOf OnMyFormLoad
            AddHandler value.FormClosed, AddressOf OnMyFormClosed
        End Sub
    
        Private Sub SetPreMyForm()
            If _myForm IsNot Nothing Then
                RemoveHandler _myForm.Load, AddressOf OnMyFormLoad
                RemoveHandler _myForm.FormClosed, AddressOf OnMyFormClosed
            End If
        End Sub
    
        Private Sub OnMyFormLoad(sender As Object, e As EventArgs)
            Me.BackColor = _formShownBackgroundColor
        End Sub
    
        Private Sub OnMyFormClosed(sender As Object, e As FormClosedEventArgs)
            MyForm = Nothing
            Me.BackColor = _defaultBackgroundColor
        End Sub
    
    
        Public Sub ShowFMyForm()
            If _myForm Is Nothing Then
                Throw New NullReferenceException()
            End If
            _myForm.Show()
        End Sub
    End Class
    

     

    UserControls 放在 Form1 上, Form1 的程式碼 (我放了個 FlowLayoutPanel 便於排列這些 UserControls)

    Public Class Form1
    
        Private _statusUserControls As List(Of StatusUserControl)
    
        Sub New()
    
            ' 此為設計工具所需的呼叫。
            InitializeComponent()
    
            ' 在 InitializeComponent() 呼叫之後加入任何初始設定。
    
            _statusUserControls = New List(Of StatusUserControl)
            Dim status2 As StatusUserControl = New StatusUserControl()
           
            Me.FlowLayoutPanel2.Controls.Add(status2)
            _statusUserControls.Add(status2)
    
            Dim status3 As StatusUserControl = New StatusUserControl()
            
            Me.FlowLayoutPanel2.Controls.Add(status3)
            _statusUserControls.Add(status3)
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If _statusUserControls(0).MyForm Is Nothing Then
                _statusUserControls(0).MyForm = New Form2()
            End If
            _statusUserControls(0).MyForm.Show()
        End Sub
    
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            If _statusUserControls(1).MyForm Is Nothing Then
                _statusUserControls(1).MyForm = New Form3()
            End If
            _statusUserControls(1).MyForm.Show()
        End Sub
    
       
    End Class
    

    這只是最基本的形式, 依據情境可以有很多種不同變化的寫法.(例如建立一個類別來橋接 usercontrol 和 form 的關係也是一種作法)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月21日 下午 11:48
    版主
  • 感謝你熱心幫忙,重裝之後,我還需要點時間了解。

    另外,重裝VS後,Property能寫Form了。

    但如果我換一個方式問,會不會好一些?

    其實,我想在Form1只寫入這個。其他交給UserControl自己完成。

    class form1
       Form_load
    
         'Link是UserControl的自訂性質
         Usercontrol1.Link = form2
    
       end sub
    end class

    class_Usercontrol private _Link as Form Public Property Link As Form ''Link Get Return _Link End Get Set(ByVal value As Form) _Link = value End Set End Property Private Sub UserControl_LinkFormStateChange(sender As Object, e As EventArgs) Handles Me.LinkFormStateChange ****↑LinkFormStateChange是不存在的,但我想讓它變成存在。 If Link.Created = True And Link.Visible = True Then Label1.BackColor = Color.DodgerBlue ElseIf Link.Created = True And Link.Visible = False Then Label1.BackColor = Color.Gray ElseIf Link.Created = False Then Label1.BackColor = Color.Transparent End If End Sub '然後,這個位置應該+些什麼?讓LinkFormStateChange變成存在?

    end class






    2016年2月22日 上午 04:15
  • 你要在 UserControl 自訂事件 ? (老實說, 除非你要讓另一個東西去監聽各個 UserControl 的變化, 不然 UserControl 自己掛個事件的意義不太存在, 重點不是怎麼寫, 而是寫出來的意義是甚麼?)

     Events (Visual Basic)

    問題是, 你還是要監聽那些被管理的 Form 的 Load 和 Closed 啊, 不然 UserControl 怎麼知道 Form 的狀態 ?

    補充: 我相信你一定沒看懂我在寫甚麼, 建議你先弄懂我之前寫的程式碼, 加上一些更動應該就可以符合你的情境.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年2月22日 上午 04:30
    版主