Winforms:在设计器中创建对象并对其进行自定义

Posted

技术标签:

【中文标题】Winforms:在设计器中创建对象并对其进行自定义【英文标题】:Winforms: Create object in designer and customize it 【发布时间】:2016-05-10 02:40:22 【问题描述】:

我正在 Winforms (C#) 中创建一个新组件。该组件获取一些属性来修改行为。用户应该在他的表单上拉出组件,设置一些属性并准备好。如果我想设置通用 ComponentType 的属性(如 Form),没有问题。但是我得到了一个不是由 Designer 生成的 BindingList<>() 属性。

无法设置 StandardItems 属性。用户可以通过 AddItem-Dialog 添加项目,但永远不会创建 BindingList。

[Category("Einstellungen")]
[Browsable(true)]      
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public BindingList<StandardItems> StandardItems

   get  return _standardItems; 
   set
   
     _standardItems = value;
     _standardItems.ListChanged -= _standardItems_ListChanged;
     _standardItems.ListChanged += _standardItems_ListChanged;
    

我以为设计师会为我创建列表。这样我就可以直接通过设计器添加项目。

这是我的组件的设计器代码:

this.menuBar1.BarManager = null;
this.menuBar1.DockCol = 0;
this.menuBar1.OptionsBar.AllowQuickCustomization = false;
this.menuBar1.OptionsBar.DrawDragBorder = false;
this.menuBar1.OptionsBar.RotateWhenVertical = false;
this.menuBar1.OptionsBar.UseWholeRow = true;
this.menuBar1.ParentForm = null;
this.menuBar1.PopupMenu = null;

我想一定是这样的:

this.menuBar1.StandardItems = null;

this.menuBar1.StandardItems = new BindingList<StandardItems>();

这样我就可以通过设计器添加项目,设计器添加如下代码:

this.menuBar1.StandardItems.Add(new StandardItem());

是否有任何属性或缺少的东西?

【问题讨论】:

BindingList 是一个泛型类型。它需要知道它应该创建什么类型的对象。您如何看待 BindingList 的通用编辑器?或者,您是否需要仅针对 BindingList 的特定编辑器? 【参考方案1】:

您需要在自定义组件中创建项目,因为设计器不知道如何创建新的BindingList&lt;StandardItems&gt;。因此,如果您自己创建 BindingList,则 Designer 可以使用此列表向其中添加值:

public class MenuBar : Component

    BindingList<StandardItems> _standardItems = new BindingList<StandardItems>()

    [Category("Einstellungen")]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]    
    public BindingList<StandardItems> StandardItems
    
        get  return _standardItems; 
        set
        
            _standardItems = value;
            _standardItems.ListChanged -= _standardItems_ListChanged;
            _standardItems.ListChanged += _standardItems_ListChanged;
        
    

这是您可以生成的设计器代码:

StandardItems standardItems1 = new StandardItems();
StandardItems standardItems2 = new StandardItems();

//

this.menuBar1.BarManager = null;
this.menuBar1.DockCol = 0;
this.menuBar1.OptionsBar.AllowQuickCustomization = false;
this.menuBar1.OptionsBar.DrawDragBorder = false;
this.menuBar1.OptionsBar.RotateWhenVertical = false;
this.menuBar1.OptionsBar.UseWholeRow = true;
this.menuBar1.ParentForm = null;
this.menuBar1.PopupMenu = null;
standardItems1.SomeProperty = 0;
standardItems1.SomeAnotherProperty = "Property0";
standardItems2.SomeProperty = 1;
standardItems2.SomeAnotherProperty = "Property1";
this.menuBar1.StandardItems.Add(standardItems1);
this.menuBar1.StandardItems.Add(standardItems2);

【讨论】:

以上是关于Winforms:在设计器中创建对象并对其进行自定义的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Winforms 设计器控件同时缩放和平移控件

在 GCP 存储桶中创建对象时触发通过 Cloud Run 部署的数据流作业

在 pyqt 设计器中创建的对象上的 findChild

在 Cloudera 中创建表单

在winforms中创建水印[重复]

在公司机器的GitLab中创建分支