C# 无法创建自定义控件的复杂属性

C# 无法创建自定义控件的复杂属性,c#,winforms,custom-controls,C#,Winforms,Custom Controls,我试图创建自定义控件的多值复杂属性,但编写的代码不起作用,只有属性资源管理器中的多值只读属性。这是它的代码 private MyComboProperties _MyComboProperties; public MyComboProperties MyComboPropertiesValues { get { return _MyComboProperties; } set { _MyComboProperties =

我试图创建自定义控件的多值复杂属性,但编写的代码不起作用,只有属性资源管理器中的多值只读属性。这是它的代码

private MyComboProperties _MyComboProperties;

public MyComboProperties MyComboPropertiesValues
{
    get
    {
        return _MyComboProperties;
    }
    set
    {
        _MyComboProperties = value;
    }
}

//MyComboProperties struct is like this

[System.Runtime.InteropServices.ComVisible(true)]
public struct MyComboProperties
{
    private string _MySourceQuery;
    private string _MyDisplayMember;
    private string _MyValueMember;

    public MyComboProperties(string mySourceQuery, string myDisplayMember, string myValueMember)
    {
        _MySourceQuery = mySourceQuery;
        _MyDisplayMember = myDisplayMember;
        _MyValueMember = myValueMember;
    }

    public string MySourceQuery
    {
        get
        {
            return _MySourceQuery;
        }
        set
        {
            _MySourceQuery = value;
        }
    }

    public string MyDisplayMember
    {
        get
        {
            return _MyDisplayMember;
        }
        set
        {
            _MyDisplayMember = value;
        }
    }

    public string MyValueMember
    { 
        get
        {
            return _MyValueMember;
        }
        set
        {
            _MyValueMember = value;
        }
    }
}

或者有人给我提供带有3个输入字符串值的多值自定义控件的示例代码。

使用下面的代码来实现您的目标

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Globalization;

namespace ExpandableMultiValuedCustomControl
{
public partial class MyComboBox : System.Windows.Forms.ComboBox
{
    private MyComboProperties _comboProperties = new MyComboProperties();
    public MyComboBox()
    {
        InitializeComponent();
    }

    public MyComboBox(IContainer container)
    {
        container.Add(this);

        InitializeComponent();
    }

    [Category("My Combo Properties")]
    [DisplayName("My Combo Properties")]
    [Description("My Combo Properties")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public MyComboProperties MyComboProperties
    {
        get
        {
            return _comboProperties;
        }
        set
        {
            _comboProperties = value;
        }
    }
}

[DisplayName("My Combo Properties")]
[Description("CMy Combo Properties")]
[DefaultProperty("Text")]
[DesignerCategory("Component")]
[TypeConverter(typeof(ExpandableObjectConverter))]

public class MyComboProperties
{
    private string _MySourceQuery;
    private string _MyDisplayMember;
    private string _MyValueMember;
    public MyComboProperties()
    {

    }

    [Category("MyComboBoxProperties")]
    [DisplayName("MySourceQuery")]
    [Description("MySourceQuery")]
    public string MySourceQuery
    {
        get
        {
            return _MySourceQuery;
        }
        set
        {
            _MySourceQuery = value;
        }
    }

    [Category("MyComboBoxProperties")]
    [DisplayName("MyDisplayMember")]
    [Description("MyDisplayMember")]
    public string MyDisplayMember
    {
        get
        {
            return _MyDisplayMember;
        }
        set
        {
            _MyDisplayMember = value;
        }
    }

    [Category("MyComboBoxProperties")]
    [DisplayName("MyValueMember")]
    [Description("MyValueMember")]
    public string MyValueMember
    {
        get
        {
            return _MyValueMember;
        }
        set
        {
            _MyValueMember = value;
        }
    }
    }
}
要访问这些属性,您必须像这样访问:

myComboBox1.MyComboProperties.MyDisplayMember 
myComboBox1.MyComboProperties.MyValueMember 
myComboBox1.MyComboProperties.MySourceQuery

我已经对答案做了必要的更改,例如在MyComboProperties中添加了setter,并对[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]进行了注释,请现在检查。此外,您甚至不需要重写ComboTypeConverter中的任何方法,只需声明一个继承TypeConverter的空类即可。答案的最终版本已准备就绪,并由我更新。我已经尽可能地优化了它。