چگونگی فهمیدن اینکه اشیا زیر مجموعه انتخاب شدند در VB.net

ms_vb

Member
سلام
من میخواهم یک شی بسازم که از Panel ارث بری کرده باشد و وقتی که یکی از اشیاء زیر مجموعه (Child)آن را انتخاب کنیم یک قطعه کد اجرا شود.
مشکل اینجاست که نمیدانم چگونه Select شدن اشیاء فرزند این Panel را تشخیص دهم.
ممنون میشم اگه راهنمایی کنید
 

the_king

مدیرکل انجمن
سلام
من میخواهم یک شی بسازم که از Panel ارث بری کرده باشد و وقتی که یکی از اشیاء زیر مجموعه (Child)آن را انتخاب کنیم یک قطعه کد اجرا شود.
مشکل اینجاست که نمیدانم چگونه Select شدن اشیاء فرزند این Panel را تشخیص دهم.
ممنون میشم اگه راهنمایی کنید

می خواهید یک کلاس بسازید که از Panel ارث بری کرده باشد :
کد:
Public Class MyPanel
    Inherits Panel

End Class

و رخدادی برای تشخیص انتخاب شدن فرزندانش داشته باشد :
کد:
    Public Event ChildGotFocus(ByVal e As ControlEventArgs)

که وقتی فرزند جدیدی بهش اضافه شد، توسط یک متدی به رخداد GotFocus آن فرزند جدید متصل شود :
کد:
    Protected Overrides Sub OnControlAdded(ByVal e As ControlEventArgs)
        MyBase.OnControlAdded(e)
        AddHandler e.Control.GotFocus, AddressOf Child_GotFocus
    End Sub

و وقتی فرزندی ازش حذف شد از رخداد GotFocus اش جدا شود :
کد:
    Protected Overrides Sub OnControlRemoved(ByVal e As ControlEventArgs)
        RemoveHandler e.Control.GotFocus, AddressOf Child_GotFocus
        MyBase.OnControlRemoved(e)
    End Sub

و در آن متد با رخداد خودش به برنامه نویس اعلام کند که فلان کنترل انتخاب شد :
کد:
    Private Sub Child_GotFocus(ByVal sender As Object, ByVal e As EventArgs)
        RaiseEvent ChildGotFocus(New ControlEventArgs(sender))
    End Sub

کد کاملش میشه این :
کد:
Public Class MyPanel
    Inherits Panel

    Public Event ChildGotFocus(ByVal e As ControlEventArgs)

    Protected Overrides Sub OnControlAdded(ByVal e As ControlEventArgs)
        MyBase.OnControlAdded(e)
        AddHandler e.Control.GotFocus, AddressOf Child_GotFocus
    End Sub

    Protected Overrides Sub OnControlRemoved(ByVal e As ControlEventArgs)
        RemoveHandler e.Control.GotFocus, AddressOf Child_GotFocus
        MyBase.OnControlRemoved(e)
    End Sub

    Private Sub Child_GotFocus(ByVal sender As Object, ByVal e As EventArgs)
        RaiseEvent ChildGotFocus(New ControlEventArgs(sender))
    End Sub
End Class

اگر این Panel را روی فرم قرار دهید یک رخداد جدید ChildGotFocus داره و با اون بهتون اعلام می کنه که فلان کنترل که فرزند درجه یک این Panel است انتخاب شده.

فرضا :
کد:
Public Class Form1

    Private Sub MyPanel1_ChildGotFocus(ByVal e As System.Windows.Forms.ControlEventArgs) Handles MyPanel1.ChildGotFocus
        Me.Text = e.Control.Name
    End Sub
End Class
 

ms_vb

Member
بازهم ممنون از جوابهایتان
حالا اگر بخواهیم در حالت Design کد مورد نظر اجرا شود چه باید کرد؟:?:
 

the_king

مدیرکل انجمن
بازهم ممنون از جوابهایتان
حالا اگر بخواهیم در حالت Design کد مورد نظر اجرا شود چه باید کرد؟:?:

شما این کد رو برای رخداد OnControlAdded وارد کنید و بعد از اینکه کد رو کامپایل کردید در Panel تان در فرم کنترل جدیدی اضافه کنید، رنگ Panel تغییر خواهد کرد :
کد:
    Protected Overrides Sub OnControlAdded(ByVal e As ControlEventArgs)
        MyBase.OnControlAdded(e)
        AddHandler e.Control.GotFocus, AddressOf Child_GotFocus
        Dim rnd As New Random()
        Me.BackColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))
    End Sub

این مثال رو برای نوشتم که ببینید کد شما در هنگام Design اجرا میشه، بدون مشکل. اما مساله در مورد انتخاب شدن کنترل این است که در Designer انتخاب شدن
یک کنترل به معنای Select یا Focused شدن اش نیست، وقتی Designer یک کنترل را انتخاب می کند رویش Focus قرار نمی دهد، صرفا یک کادر ظاهری دورش نمایش می دهد.
در نتیجه رخداد GotFocus ای هم اتفاق نمی افته که حالا Panel شما با خبر بشه یا نه.
 

جدیدترین ارسال ها

بالا