C # WinForms Base UserControl - PullRequest
       6

C # WinForms Base UserControl

1 голос
/ 28 октября 2019

У меня есть некоторые проблемы в VS2019 с UserControls.

У меня есть базовый пользовательский элемент управления (WinForms), от которого я хочу наследовать все остальные пользовательские элементы управления. Базовый элемент управления предоставляет ряд общих свойств, которые мне нужны.

public partial class MyBaseControl : System.Windows.Forms.UserControl
{

    internal Int32 _caseID;
    internal object _objectID;

    public int CaseID { get => _caseID; set => _caseID = value; }
    public object ObjectID { get => _objectID; set => _objectID = value; }

    internal virtual void MakeScreenReadOnly()
    {
    }
    public MyBaseControl()
    {
        Type systemType = this.GetType();
        PropertyInfo propertyInfo = systemType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        this.AutoScroll = true;

    }

}

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

public partial class AddressControl : MyBaseControl
    {
....
}

Я получаю ошибку

The service System.Windows.Forms.Design.IEventHandlerService already exists in the service container. Parameter name: serviceType

при попытке просмотра AddressControl в конструкторе.

Раньше это работало в более ранней версииVisual Studio. У кого-нибудь есть какие-либо идеи ?

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Вы можете попытаться воссоздать пользовательский элемент управления.

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

Переместить старые файлы за пределы папки проекта (MyBaseControl.cs &MyBaseControl.Designer.cs).

Используйте мастер Project > Add > User control.

Скопируйте в него старый код.

И не удаляйте InitializeComponent(); из конструктора:добавьте ваш код после.

Это может работать и решить вашу проблему, если Visual Studio не поврежден, иначе вы можете попробовать восстановить или удалить и переустановить его.

Вот что я пытался:

  • Я добавил этот пользовательский контроль:

    public partial class UserControl1 : UserControl
    {
      public UserControl1()
      {
        InitializeComponent();
      }
    }
    
  • Я скомпилировал.

  • Я добавил еще один пользовательский контроль и изменилродитель:

    public partial class UserControl2 : UserControl1
    {
      public UserControl2()
      {
        InitializeComponent();
      }
    }
    

Работает нормально и дизайнер отображает оба корректно.

Далее я добавил ваш код , удерживая вызов InitializeComponent() :

public partial class UserControl1 : UserControl
{
  internal Int32 _caseID;
  internal object _objectID;

  public int CaseID { get => _caseID; set => _caseID = value; }
  public object ObjectID { get => _objectID; set => _objectID = value; }

  internal virtual void MakeScreenReadOnly()
  {
  }
  public UserControl1()
  {
    InitializeComponent();
    Type systemType = this.GetType();
    PropertyInfo propertyInfo = systemType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
    this.AutoScroll = true;
  }
}

Компилирую.

Все тоже отлично работает.

0 голосов
/ 28 октября 2019
  • Выход из Visual Studio.
  • Открыть проводник: перейдите в папку, в которой находится ваш проект.
  • Удалите папки bin и obj.
  • Снова откройте Visual Studio, откройте и заново скомпилируйте проект.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...