自定义组合框:阻止设计者添加到项目

时间:2018-10-19 07:27:33

标签: c# winforms combobox user-controls designer

我有一个自定义组合框控件,该控件应该显示可用的网络摄像头列表。

代码很小。

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;
        }
    }
}

但是,我遇到了两个错误。 首先,每当我放置此组合框的一个实例时,designer都会生成以下代码:

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。即使我不触摸设计器中的Items属性,也会发生这种情况。

“ HP网络摄像头”是当时我的计算机上唯一的摄像头。

如何抑制这种行为?

2 个答案:

答案 0 :(得分:1)

问题在于,构造函数中的绑定是由设计人员运行的。您可以尝试将其移至Initialize或Loaded事件

答案 1 :(得分:1)

当您将控件放在窗体上时,构造函数代码将运行任何加载代码。其中的任何更改属性值的代码都将在设计时执行,因此将以您放下控件的形式写在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文件中生成的代码