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

4

我正在尝试创建自定义控件的多值复杂属性,但编写的代码没有起作用,只有多值只读属性出现在属性资源管理器中。以下是该属性的代码:

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个输入字符串值。
1个回答

2
使用以下代码来实现您的目标。
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)],请现在检查一下。 - Prakash Vishwakarma
此外,您甚至不需要覆盖ComboTypeConverter中的任何方法,只需声明一个继承TypeConverter的空类即可。 - Prakash Vishwakarma
我的最终版本答案已经完成并由我进行了更新。我已经将其优化到最大程度。 - Prakash Vishwakarma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接