代码之家  ›  专栏  ›  技术社区  ›  ceztko Jeff Davis

创建可识别设计器的UserControl集合,以便在运行时使用

  •  1
  • ceztko Jeff Davis  · 技术社区  · 14 年前

    我有一个面板,我想在运行时填充一些用户控件。这些控件很复杂,可能相互依赖,因此我希望它们:

    • 可以用visualstudio设计器编辑;

    这两个要求都是必须具备的。

    考虑到UserControl本身就是控件的索引集合,我开始在同一个类中设计控件,而不关心它们的实际位置(将在运行时指定)。我已经对DevComponents功能区容器使用了相同的方法(非常满意),所以我最初认为标准UserControl也可以使用相同的方法。

    我的问题是:有没有一种干净且受支持的方法来创建这个支持设计器的UserControl集合?我将这种方法称为模式,因为它确实增加了代码的清晰性和效率。

    谢谢,

    注意:作为一种解决方法,我创建了一个DummyControlContainer类,该类继承UserControl,并在ControlAdded事件中保持字典映射(代码如下)。想知道有没有更干净的。

    public partial class DummyControlContainer : UserControl
    {
        private Dictionary<string, Control> _ControlMap;
    
        public DummyControlContainer()
        {
            InitializeComponent();
    
            _ControlMap = new Dictionary<string, Control>();
            this.ControlAdded += new ControlEventHandler(DummyControlCollection_ControlAdded);
        }
    
        void DummyControlCollection_ControlAdded(object sender, ControlEventArgs args)
        {
            _ControlMap.Add(args.Control.Name, args.Control);
        }
    
        public Control this[string name]
        {
            get { return _ControlMap[name]; }
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   ceztko Jeff Davis    14 年前

    在实际项目中测试和使用它之后,我越来越确信,如果您需要这样的模式,我的解决方案是干净和安全的。此容器用于填充控制装置,如面板或类似装置。为了防止可绑定数据源出现一些不良行为,我为添加到此容器的每个新控件提供了自己的BindingContext。好好享受。

    public partial class DummyControlContainer : UserControl
    {
        private Dictionary<string, Control> _ControlMap;
    
        public DummyControlContainer()
        {
            InitializeComponent();
    
            _ControlMap = new Dictionary<string, Control>();
            this.ControlAdded +=
                new ControlEventHandler(DummyControlCollection_ControlAdded);
        }
    
        void DummyControlCollection_ControlAdded(object sender,
            ControlEventArgs args)
        {
            // If the added Control doesn't provide its own BindingContext,
            // set a new one
            if (args.Control.BindingContext == this.BindingContext)
                args.Control.BindingContext = new BindingContext();
            _ControlMap.Add(args.Control.Name, args.Control);
        }
    
        public Control this[string name]
        {
            get { return _ControlMap[name]; }
        }
    }