Пользовательский ComboBox: запретить дизайнеру добавлять элементы - PullRequest
0 голосов
/ 19 октября 2018

У меня есть пользовательский элемент управления списком, который должен отображать список доступных веб-камер.

Код довольно крошечный.

using System;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using DirectShowLib;

namespace CameraSelectionCB
{
    public partial class CameraComboBox : ComboBox
    {
        protected BindingList<string> Names;
        protected DsDevice[] Devices;
        public CameraComboBox()
        {
            InitializeComponent();
            Devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
            Names = new BindingList<string>(Devices.Select(d => d.Name).ToList());
            this.DataSource = Names;
            this.DropDownStyle = ComboBoxStyle.DropDownList;
        }
    }
}

Однако я столкнулся с парой ошибок,Во-первых, всякий раз, когда я помещаю экземпляр этого комбинированного списка, конструктор генерирует следующий код:

this.cameraComboBox1.DataSource = ((object)(resources.GetObject("cameraComboBox1.DataSource")));
this.cameraComboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cameraComboBox1.Items.AddRange(new object[] {
        "HP Webcam"});

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

"Веб-камера HP" - единственная камера, присутствующая на моем компьютере в то время.

Как я могу подавить такое поведение?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Когда вы опускаете свой элемент управления на форму, код конструктора и любой код загрузки будут выполняться.Любой код, изменяющий значение свойства, будет выполнен во время разработки и, следовательно, будет записан в файле designer.cs формы, в которой вы сбросили свой элемент управления.
При программировании элементов управления вы всегда должны помнить об этом.

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

protected bool IsInDesignMode
{
    get { return DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime; }
}

protected BindingList<string> Names;
protected DsDevice[] Devices;
public CameraComboBox()
{
    InitializeComponent();

    if (InDesignMode == false)
    {
        // only do this at runtime, never at designtime...
        Devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
        Names = new BindingList<string>(Devices.Select(d => d.Name).ToList());
        this.DataSource = Names;
    }
    this.DropDownStyle = ComboBoxStyle.DropDownList;
}

Теперь привязка будет происходить только во время выполнения

Не забудьте удалить сгенерированный код в файле Designer.cs при попытке этого

0 голосов
/ 19 октября 2018

Проблема в том, что связывание в конструкторе выполняется дизайнером.Вы можете попробовать переместить его в события Initialize или Loaded

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