مقال- أفكار في الدوت نت Enum - RaggiTech - 05-10-12
كاتب المشاركة : silverlight
كيف تبني كونترول يقبل ُEnum فقط
من الممكن بناء كونترول يقبل Enum فقط وبطريقة بسيطة جدا ..... ومثال علي ذلك ListBox Control أو ComboBox Control والفكرة ببساطة كالأتي
بما اننا نستطيع الحصول علي Strings الموجودة داخل Enum وذلك باستخدام GetType لذلك من الممكن أن نضيف صفة Property الي الكونترول ومن ثم نمرر لها أي Enum وهذه االصفة Property ستكون من النوع Type والكود التالي يوضح الأمر
كود :
Private _enumType As Type
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
Public Property EnumType As Type
Get
Return Me._enumType
End Get
Set(ByVal value As Type)
If (Not Me._enumType Is value) Then
Me._enumType = value
MyBase.Items.Clear()
If Not Me._enumType.IsEnum Then
Throw New ArgumentException((Me._enumType.FullName) & " is not enum")
End If
For Each obj As Object In [Enum].GetValues(Me._enumType)
MyBase.Items.Add(obj)
Next
End If
End Set
End Property
وكما سبق و أوضحت يمكن إضافة مثل هذه Property الموجودة في الكود أعلاه الي أي كونترول مثل ListBox أو ComboBox
والكود التالي يوضح ذلك ...............
EnumListBox كونترول
كود :
Imports System.Windows.Forms
Imports System.ComponentModel
Public Class EnumListBox
Inherits ListBox
#Region " Fields "
Private _enumType As Type
Private components As IContainer
#End Region
#Region " Constructor "
Public Sub New()
Me.InitializeComponent()
End Sub
#End Region
#Region " Properties "
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
Public Property EnumType As Type
Get
Return Me._enumType
End Get
Set(ByVal value As Type)
If (Not Me._enumType Is value) Then
Me._enumType = value
MyBase.Items.Clear()
If Not Me._enumType.IsEnum Then
Throw New ArgumentException((Me._enumType.FullName) & " is not enum")
End If
For Each obj As Object In [Enum].GetValues(Me._enumType)
MyBase.Items.Add(obj)
Next
End If
End Set
End Property
#End Region
#Region " Methods "
Private Sub InitializeComponent()
Me.components = New Container
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If (disposing AndAlso (Not Me.components Is Nothing)) Then
Me.components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub
#End Region
End Class
EnumComboBox كونترول
كود :
Imports System.Windows.Forms
Imports System.ComponentModel
Public Class EnumComboBox
Inherits ComboBox
#Region " Fields "
Private _enumType As Type
Private components As IContainer
#End Region
#Region " Constructor "
Public Sub New()
Me.InitializeComponent()
End Sub
#End Region
#Region " Properties "
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
Public Property EnumType As Type
Get
Return Me._enumType
End Get
Set(ByVal value As Type)
If (Not Me._enumType Is value) Then
Me._enumType = value
MyBase.Items.Clear()
If Not Me._enumType.IsEnum Then
Throw New ArgumentException((Me._enumType.FullName) & " is not enum")
End If
For Each obj As Object In [Enum].GetValues(Me._enumType)
MyBase.Items.Add(obj)
Next
End If
End Set
End Property
#End Region
#Region " Methods "
Private Sub InitializeComponent()
Me.components = New Container
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If (disposing AndAlso (Not Me.components Is Nothing)) Then
Me.components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub
#End Region
End Class ' AioComboBox
في المشاركة التالية سأوضح كيفية استخدام هذه الكونترول ......
تقبلوا تحياتي
أخوكم عمر
مقال- أفكار في الدوت نت Enum - RaggiTech - 05-10-12
كيف تستخدم كل من EnumListBox/EnumComboBox كونترول
في المشاركة السابقة أوضحت كبف تبني كونترول يقبل Enum فقط وبعد عمل Build ستجد نسخة من هذه الكونترول في صندوق الأدوات والكود التالي يوضح كيفية إستخدام أحدهما أو كليهما كالأتي
كود :
Public Class Form1
Private align As ContentAlignment = ContentAlignment.TopLeft
Private clr As Color = Color.Empty
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim knownColorType As Type = GetType(KnownColor)
Me.EnumListBox1.EnumType = knownColorType
Dim contentAlignmentType As Type = GetType(ContentAlignment)
Me.EnumComboBox1.EnumType = contentAlignmentType
End Sub
Private Function StringToEnum(Of T)(ByVal value As String, ByVal ignoreCase As Boolean) As T
If [Enum].IsDefined(GetType(T), value) Then
Return CType([Enum].Parse(GetType(T), value, ignoreCase), T)
End If
Throw New ArgumentException("value is not Enum")
End Function
Private Sub EnumListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnumListBox1.SelectedIndexChanged
clr = Color.FromKnownColor(StringToEnum(Of KnownColor)(Me.EnumListBox1.SelectedItem.ToString, True))
Invalidate()
End Sub
Private Sub EnumComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnumComboBox1.SelectedIndexChanged
align = StringToEnum(Of ContentAlignment)(Me.EnumComboBox1.SelectedItem.ToString, False)
Invalidate()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Dim TestRectangle As New Rectangle(10, 10, 200, 200)
Dim frameRect As Rectangle = TestRectangle
frameRect.X -= 4
frameRect.Y -= 4
frameRect.Width += 8
frameRect.Height += 8
Using obrush As New Drawing2D.LinearGradientBrush(frameRect, ControlPaint.Light(clr), ControlPaint.Dark(clr), Drawing2D.LinearGradientMode.Vertical)
e.Graphics.FillRectangle(obrush, frameRect)
Using framePen As New Pen(Brushes.Black)
e.Graphics.DrawRectangle(framePen, frameRect)
End Using
End Using
If Me.Text IsNot Nothing Then
Dim format As New StringFormat()
format.LineAlignment = StringAlignment.Center
format.Trimming = StringTrimming.EllipsisCharacter
Select Case align
Case ContentAlignment.BottomCenter
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Far
Exit Select
Case ContentAlignment.BottomLeft
format.Alignment = StringAlignment.Near
format.LineAlignment = StringAlignment.Far
Exit Select
Case ContentAlignment.BottomRight
format.Alignment = StringAlignment.Far
format.LineAlignment = StringAlignment.Far
Exit Select
Case ContentAlignment.MiddleCenter
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Center
Exit Select
Case ContentAlignment.MiddleLeft
format.Alignment = StringAlignment.Near
format.LineAlignment = StringAlignment.Center
Exit Select
Case ContentAlignment.MiddleRight
format.Alignment = StringAlignment.Far
format.LineAlignment = StringAlignment.Center
Exit Select
Case ContentAlignment.TopCenter
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Near
Exit Select
Case ContentAlignment.TopLeft
format.Alignment = StringAlignment.Near
format.LineAlignment = StringAlignment.Near
Exit Select
Case ContentAlignment.TopRight
format.Alignment = StringAlignment.Far
format.LineAlignment = StringAlignment.Near
Exit Select
End Select
Dim fnt As New Font("Times New Roman", 20.0F, FontStyle.Bold)
Using sb As New SolidBrush(Color.White)
e.Graphics.DrawString(Me.Text, fnt, sb, TestRectangle, format)
End Using
End If
End Sub
End Class
وستلاحظون أننا نقوم بتعريف Type من أي Enum ثم نمرره الي Property EnumType والكود التالي يوضح كيفية تمرير القيم الي Property EnumType
كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim knownColorType As Type = GetType(KnownColor)
Me.EnumListBox1.EnumType = knownColorType
Dim contentAlignmentType As Type = GetType(ContentAlignment)
Me.EnumComboBox1.EnumType = contentAlignmentType
End Sub
بالمرفقات ستجدون نسخة من الكونترول وكيفية استخدامهم والكود بنسخة الفيجوال 2010
ولمستخدمي النسخ السابقة لنسخة 2010 يمكنهم نسخ الكود واستخدامه.............
ملحوظة أخيرة:
بالرغم أنني استخدمت جميع Enum لرسم أشياء علي الفورم لكن الأمر لايقتصر علي ذلك فقط فالفكرة بالنهاية واحدة ويمكن الإستفادة منها مع اي Enum ..............الأمر متروك لإبداعكم.....
تقبلوا تحياتي ولاتنسونا في دعاؤكم.............
أخوكم عمر
مقال- أفكار في الدوت نت Enum - RaggiTech - 05-10-12
كاتب المشاركة : شبح عتيبه
شكرآ لك وانا ماحيرني في هذيه Enum كلما رأيتها أقول ياربي وشهي بس لقيت فايدتها ولا احسن
شكرآ لك ولكن لدي سؤال كيف اضيف الاكواد داخل كلمه معينه أقصد مثلآ وضعت هذا الكود
اقتباس:
[TABLE="width: 100%"]
[TR]
[TD="class: alt2"]Puplice Enum Test
Open
Close
Big Window
Small Window
end enum [/TD]
[/TR]
[/TABLE]
سؤالي كيف اضع كود داخل Open او Close او Big Windows او Small Window
ماشاءالله على كود الاداء ماشاءالله كثيره المشكله إني مره مبتدئ لو إني محترف لقيتي فككت الكود تفكيك ... بس أنتظر الاجابه بفارغ الصبر , شكرآ لك إبداع بلا حدود
|