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

标签 c# winforms devexpress windows-forms-designer

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

enter image description here

无法设置 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<StandardItems> .所以,如果你创建你的 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);

关于c# - Winforms:在设计器中创建对象并对其进行自定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35134042/

相关文章:

c# - 从另一个类(在另一个线程上)写在文本框中

devexpress - 是否可以在 DevExpress XtraReport 中向上移动空标签?

c# - 如何删除 Entity Framework 6 中的多对多关系

C# 延迟模式对话框在加载时显示,同时允许继续执行

c# - 请求被中止 : Could not create SSL/TLS secure channel. |系统.Net.WebException

c# - 按下按钮时移动鼠标会引发什么事件?

c# - 检查一个列表是否按顺序包含另一个列表中的所有项目

.net - winforms 应用程序中的窗口关闭事件

c# - DevExpress XtraReport GDI+ 一般错误

c# - DevExpress MemoEdit Control 比 TextEdit 重很多吗?