Выберите значение в конструкторе для свойства Type - PullRequest
1 голос
/ 04 мая 2010

У меня есть UserControl, который предоставляет свойство System.Type.Я хочу сделать его устанавливаемым во время разработки, например, свойство DataSource в BindingSource.В конечном счете, я хотел бы, чтобы код разработчика генерировал это:

this.EntityType = typeof(Company.Product.Class);

Где выбор класса будет происходить из зарегистрированных источников данных проекта.

Прямо сейчас я выставляю BindingSource непосредственноэффект, но я хотел бы знать, как я могу повторить его поведение для моего контроля.

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

Вам потребуется TypeConverter для преобразования между строковым представлением типа, как показано в окне «Свойства», и типом. Вы очень неопределенны в своем вопросе, поэтому я просто найду ответ. Хорошим кандидатом является класс TypeListConverter, он уже выполняет тяжелую работу. Вам просто нужно получить свой собственный и вызвать базовый конструктор со списком типов, которые вы принимаете:

  public partial class UserControl1 : UserControl {
    public UserControl1() {
      InitializeComponent();
    }
    [TypeConverter(typeof(myTypeTypeConverter))]
    public Type Type { get; set; }

    private class myTypeTypeConverter : TypeListConverter {
      private static Type[] types = new Type[] { typeof(int), typeof(string), typeof(long) };
      public myTypeTypeConverter() : base(types) {}
    }
  }

После того, как вы опустите этот элемент управления в форме, вы можете использовать поле со списком для свойства Тип и выбрать один из трех типов. Если это не подходит, вам придется создать свой собственный TypeConverter. Используйте Reflector, чтобы взглянуть на TypeListConverter. Это не очень большой.

1 голос
/ 02 сентября 2010

Этот пост помог мне решить эту же проблему.

Свойство Visual Studio Design Time - раскрывающийся список форм

Это моя реализация, она создает выпадающий список типов, доступных из текущего проекта, и фильтрует их по базовому классу.

Вы должны добавить ссылку на EnvDTE

    Public Class EditChildFormDesignerTypeEditor
    Inherits UITypeEditor

    Public Overrides Function GetEditStyle(ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle
        Return UITypeEditorEditStyle.DropDown
    End Function

    Public Overrides Function EditValue(ByVal context As ITypeDescriptorContext, ByVal provider As IServiceProvider, ByVal value As Object) As Object
        Dim edSvc = DirectCast(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService)


        Dim dte As EnvDTE.DTE = context.GetService(GetType(EnvDTE.DTE))
        If dte Is Nothing Then Throw New InvalidOperationException("DTE not found.")

        Dim lb As New ListBox()

        For Each proj As Project In dte.Solution.Projects
            For Each ce As CodeElement In proj.CodeModel.CodeElements
                If ce.Kind = vsCMElement.vsCMElementClass Then
                    Dim ccl As CodeClass = ce
                    If ccl.IsDerivedFrom(GetType(frmEditChildItem).FullName) Then
                        Dim Tp As Type = Type.GetType(ccl.FullName)
                        If Tp IsNot Nothing Then
                            lb.Items.Add(Tp)
                        End If
                    End If
                End If
            Next
        Next

        If value IsNot Nothing Then
            lb.SelectedItem = value
        End If

        edSvc.DropDownControl(lb)

        value = DirectCast(lb.SelectedItem, Type)

        Return value
    End Function
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...