Enum, ComboBox и их связывание

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Enum, ComboBox и их связывание

Сообщение natcap » 26.08.2010 (Чт) 11:12

Есть класс, у которого свойство типа Enum:

Код: Выделить всё
Public Class MaterialBase
    Sub New()
    End Sub

    Private _studyStatus As StudyStatusEnum

    <DisplayName("Статус кабинета")> _
   <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
   <TypeConverter(GetType(EnumTypeConverter))> _
  Public Property StudyStatus() As StudyStatusEnum
        Get
            Return _studyStatus
        End Get
        Set(ByVal value As StudyStatusEnum)
            _studyStatus = value
        End Set
    End Property
End class


Код: Выделить всё
Public Enum StudyStatusEnum As Integer
    <Description("комната")> _
    room
    <Description("кабинет")> _
    study
    <Description("лаборатория")> _
    laboratory
End Enum


Теперь это свойство я связываю с создаваемым ComboBox:

Код: Выделить всё
sub main
     dim PartObj as new MaterialBase
     dim name  as string = "StudyStatus"
     dim tlpPart as new TableLayoutPanel
cbx = CreateObject.ComboBox(name  , DockStyle.Top, PartObj, tlpPart, GetType(StudyStatusEnum))
end sub

    Public Function ComboBox(ByVal name As String, ByVal DockType As DockStyle, ByVal PartObj As Object, ByVal ParentObject As Object, enumType as Type) As ComboBox
        Dim cbx As ComboBox
        cbx = New ComboBox
        With cbx
            .Name = "cbx" & name
            .Dock = DockType
            .Visible = True
            .DataSource = [Enum].GetValues(enumType)
            .DataBindings.Add("Text", PartObj, name)
        End With
        ParentObject.Controls.Add(cbx)
        Return cbx
    End Function


Вот вопросы:
1. как правильно связать enum с comboBox, чтобы заполнялось значениями из Description?
2. С каким свойством ComboBox связывать свойство моего объекта, чтобы по выбор пункта списка соответствовал свойству объекта?
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Enum, ComboBox и их связывание

Сообщение 1Steps » 26.08.2010 (Чт) 14:34

Код: Выделить всё
Public Class Form1

    Enum TestEnum
        <EnumDescription("Вчера")> _
        Yesterday = 0
        <EnumDescription("Сегодня")> _
        Today = 1
        <EnumDescription("Завтра")> _
        Tomorrow = 2
    End Enum

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim cmb As New ComboBox()
        cmb.DataSource = AttrClass.ToList(GetType(TestEnum))
        cmb.DisplayMember = "Value"
        cmb.ValueMember = "Key"
        Me.Controls.Add(cmb)
    End Sub
End Class

<AttributeUsage(AttributeTargets.[Enum] Or _
                AttributeTargets.Field, _
                AllowMultiple:=False)> _
Public NotInheritable Class EnumDescriptionAttribute
    Inherits Attribute

    Public Sub New(ByVal description As String)
        MyBase.New()
        _description = description
    End Sub

    Private _description As String
    Public ReadOnly Property Description() As String
        Get
            Return _description
        End Get
    End Property
End Class

Public NotInheritable Class AttrClass
    Public Shared Function GetDescription(ByVal value As [Enum]) As String
        If value Is Nothing Then Throw New ArgumentNullException(value.ToString)
        Dim desc As String = value.ToString()
        Dim fInfo As Reflection.FieldInfo = value.[GetType]().GetField(desc)
        Dim attr As EnumDescriptionAttribute() = DirectCast(fInfo.GetCustomAttributes(GetType(EnumDescriptionAttribute), False), EnumDescriptionAttribute())
        If attr IsNot Nothing AndAlso attr.Length > 0 Then desc = attr(0).Description
        Return desc
    End Function

    Public Shared Function ToList(ByVal type As Type) As IList
        If type Is Nothing Then Throw New ArgumentNullException(type.Name)
        Dim L As New ArrayList()
        For Each val As [Enum] In [Enum].GetValues(type)
            L.Add(New KeyValuePair(Of [Enum], String)(val, GetDescription(val)))
        Next
        Return L
    End Function
End Class
Удалена за ненадобностью.

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Re: Enum, ComboBox и их связывание

Сообщение natcap » 26.08.2010 (Чт) 15:43

Спасиб :) Русские названия отобразились, осталось слинковать с объектом:

.DataBindings.Add("Text", PartObj, name)


Вот вместо Text какое-то другое свойство надо. а какое - никак не подберу :(
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Enum, ComboBox и их связывание

Сообщение 1Steps » 26.08.2010 (Чт) 16:15

...а какое - никак не подберу
Надо не подбирать, а четко знать, что возвращает SelectedValue.
Ты тестировала?
Ты точки останова ставила?
Измени мой пример на этот
Код: Выделить всё
    Private Sub ComboBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedValueChanged
        If TypeOf Me.ComboBox1.SelectedValue Is TestEnum Then
            Dim v As TestEnum = CType(Me.ComboBox1.SelectedValue, TestEnum)
            MsgBox(v.ToString & "{" & v & "}")
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.ComboBox1.DataSource = AttrClass.ToList(GetType(TestEnum))
        Me.ComboBox1.DisplayMember = "Value"
        Me.ComboBox1.ValueMember = "Key"
    End Sub

Обрати внимание на обрабодчик ComboBox1_SelectedValueChanged.
Поставь MsgBox перед проверкой типа и сразу станет всё понятно.
Удалена за ненадобностью.

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Re: Enum, ComboBox и их связывание

Сообщение natcap » 26.08.2010 (Чт) 16:37

Мда.. похоже все же спать надо больше.. я первое что поставила - SelectedValue - у меня то ли ошибка вылезла, то ли не сохранилось изменение.. в общем, фигня какая-то получилась .. а сейчас поставила - все нормально, съелось :shock: Спасибо еще раз :)
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 21

    TopList