2013-08-28 62 views
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输入字符串值。

回答

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 
+0

此代码的工作,但没有得到设置 –

+0

属性我已经做了回答,如添加二传手要紧的变化MyComboProperties和评论[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)],plz现在检查。 –

+0

此外,您甚至不需要重写ComboTypeConverter中的任何方法,只需声明一个继承TypeConverter的空类即可。 –