自定义控件添加属性

时间:2022-08-20 20:36:37
又得请教各位高手了,
   自定义控件添加属性,我现在想添加两个属性,达到一种连动,
当我在第一个属性选择时,第二个属性的选择项是跟着变化的,
例如:当我在第一个属性的下拉列表框选择A时,第二个属性的下拉框里面变成K,L,D这三项供选择
      当我在第一个属性的下拉列表框选择B时,第二个属性的下拉框里面变成R,Y,P这三项供选择

先谢谢了,哪位帮忙啊,
不胜感激!

18 个解决方案

#1


那你在SelectedIndexChanged里面重新绑定不行么?

#2


关注之中,帮你顶一下

#3


谢谢啊,

2楼的朋友那个方法,我没试成功,

但是非常感谢

同样感谢3楼的,

帮我顶贴

#4


这个问题有点意思,帮忙顶一下,希望看到解决。
不过奇怪的是为什么属性用动态的呢?

#5


if (comboBox1.Text == "A")
            {
                comboBox2.Items.Clear();
                comboBox2.Items.Add("A1");
                comboBox2.Items.Add("A2");
                comboBox2.Items.Add("A3");
            }
            else
            {
                comboBox2.Items.Clear();
                comboBox2.Items.Add("B1");
                comboBox2.Items.Add("B2");
                comboBox2.Items.Add("B3");
            }

#6


http://www.codeproject.com/csharp/dropdownproperties.asp

#7


关注,帮顶了

#8


学习,帮顶

#9


// 比较常规的代码模型

public SomeType PropertyA
{
     get; 
     set { OnPropertyAChanged(null); // ... }
}

private void OnPropertyAChanged(EventArgs e)
{
      // here changes property B 
}

#10


以TextBox为例
using System;
using System.Windows.Forms;
using System.Drawing.Design;
using System.ComponentModel;
using System.Globalization;
using System.Windows.Forms.Design;
public class TextBoxEx:TextBox
{
  private All a= All.A;
  private object b;
  public All A
  {
    get
    {
      return a;
    }
    set
    {
      a=value;
      switch(value)
      {
        case All.A:
          b=Aenum.D;
          break;
        case All.B:
          b=Benum.P;
          break;
      }
    }
  }

  [System.ComponentModel.Editor(typeof(EnumEditer),typeof(UITypeEditor))]
  public object B
  {
    get 
    {
      return b;
    }
    set
    {
      b=value;
    }
  }
}

public class  EnumEditer:UITypeEditor
{
  ListBox dropdown ;
  IWindowsFormsEditorService edSvc;
  public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object Value)
  {
    if (provider != null && Value !=null) 
    {
      edSvc =  (IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService));
      if ((edSvc ==null) || (context.Instance == null)) 
      {
        return Value;
      }
      if( dropdown ==null) 
      {
        dropdown = new ListBox();
        dropdown.BorderStyle = BorderStyle.None;
        dropdown.MouseUp+= new System.Windows.Forms.MouseEventHandler(dropdown_MouseUp);
      }
      dropdown.Items.Clear();
      Array values=  System.Enum.GetValues(Value.GetType());
      for(int i=0;i<values.Length;i++)
      {
        dropdown.Items.Add(values.GetValue(i));
      }
      edSvc.DropDownControl(this.dropdown);
      Value = this.dropdown.SelectedItem;
      return Value;
    }   
    return Value;
      }
  public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
  {
    return UITypeEditorEditStyle.DropDown;
  }

  private void dropdown_MouseUp(object sender ,  System.Windows.Forms.MouseEventArgs e)
  {
    if( edSvc != null && e.Button == MouseButtons.Left && this.dropdown.SelectedIndex >= 0)
    {
      edSvc.CloseDropDown();
    }
  }

}

public enum All
{
  A,
  B
}
public enum Aenum
{
  K,
  L,
  D
}
public enum Benum
{
  R,
  Y,
  P
}

#11


没必要写那么多代码吧,要实现属性间的联动,只须要在属性的set中设置就行了
比如
public enum DragFlag
{
/// <summary>
/// 拖动节点时移动节点,即删除源节点
/// </summary>
Move=0,
/// <summary>
/// 拖动节点时不删除源节点,使用复制方法
/// </summary>
Copy=1
};
private DragFlag mouseDragFlag=DragFlag.Move,mouseDragFlag1=DragFlag.Copy;

[DefaultValue(DragFlag.Move),Description("鼠标拖动选项"),Category("XmlTreeview新属性")]
public DragFlag MouseDragFlag
{
get{return mouseDragFlag;}
set{
if(mouseDragFlag!=value)
{
mouseDragFlag=value;
MouseDragFlag1=value;//此处就简单实现了联动,具体实现的办法在此处写
}
}
}
//---------------------第二属性
[DefaultValue(DragFlag.Move),Description("鼠标拖动选项"),Category("XmlTreeview新属性")]
public DragFlag MouseDragFlag1
{
get{return mouseDragFlag1;}
set{if(mouseDragFlag!=value)mouseDragFlag1=value;}
}

#12


LZ要的是设计时支持,就是设计界中在属性栏中的第一个属性值动态显示第二个属性的下拉列表

#13


http://book.csdn.net/bookfiles/337/10033713398.shtml

参考下~!

#14


to Bote_China:
在设计期的属性窗口中修改第一属性值,第二属性动态改变不需要UITypeEditor
不信你可以复制我上面代码,随便写一控件测试,所谓的连动,无非就是一个属性改变后另一属性值跟着变,那就在属性的set语句中改变另一属性值就行了

#15


最近也正想这个问题呢,

#16


路过,帮顶

#17


TO:lovevsnet()
你写的代码本没有实现LZ的要求,仔细看看LZ的要求:
当第一个属性选择A时,第二个属性的下接列表只有K,L,D三个选顶;
当第一个属性选择B时, 第二个属性的下拉列表只有R,Y,P三个选项。
注意要求中的“只有”二字,所以lovevsnet代码没有达到要求,只是不让用户选择与第一个属性相同的值。

#18


谢谢大家帮忙回贴,我会把分数都加上,特别感谢,Bote_china,lovevsnet

#1


那你在SelectedIndexChanged里面重新绑定不行么?

#2


关注之中,帮你顶一下

#3


谢谢啊,

2楼的朋友那个方法,我没试成功,

但是非常感谢

同样感谢3楼的,

帮我顶贴

#4


这个问题有点意思,帮忙顶一下,希望看到解决。
不过奇怪的是为什么属性用动态的呢?

#5


if (comboBox1.Text == "A")
            {
                comboBox2.Items.Clear();
                comboBox2.Items.Add("A1");
                comboBox2.Items.Add("A2");
                comboBox2.Items.Add("A3");
            }
            else
            {
                comboBox2.Items.Clear();
                comboBox2.Items.Add("B1");
                comboBox2.Items.Add("B2");
                comboBox2.Items.Add("B3");
            }

#6


http://www.codeproject.com/csharp/dropdownproperties.asp

#7


关注,帮顶了

#8


学习,帮顶

#9


// 比较常规的代码模型

public SomeType PropertyA
{
     get; 
     set { OnPropertyAChanged(null); // ... }
}

private void OnPropertyAChanged(EventArgs e)
{
      // here changes property B 
}

#10


以TextBox为例
using System;
using System.Windows.Forms;
using System.Drawing.Design;
using System.ComponentModel;
using System.Globalization;
using System.Windows.Forms.Design;
public class TextBoxEx:TextBox
{
  private All a= All.A;
  private object b;
  public All A
  {
    get
    {
      return a;
    }
    set
    {
      a=value;
      switch(value)
      {
        case All.A:
          b=Aenum.D;
          break;
        case All.B:
          b=Benum.P;
          break;
      }
    }
  }

  [System.ComponentModel.Editor(typeof(EnumEditer),typeof(UITypeEditor))]
  public object B
  {
    get 
    {
      return b;
    }
    set
    {
      b=value;
    }
  }
}

public class  EnumEditer:UITypeEditor
{
  ListBox dropdown ;
  IWindowsFormsEditorService edSvc;
  public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object Value)
  {
    if (provider != null && Value !=null) 
    {
      edSvc =  (IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService));
      if ((edSvc ==null) || (context.Instance == null)) 
      {
        return Value;
      }
      if( dropdown ==null) 
      {
        dropdown = new ListBox();
        dropdown.BorderStyle = BorderStyle.None;
        dropdown.MouseUp+= new System.Windows.Forms.MouseEventHandler(dropdown_MouseUp);
      }
      dropdown.Items.Clear();
      Array values=  System.Enum.GetValues(Value.GetType());
      for(int i=0;i<values.Length;i++)
      {
        dropdown.Items.Add(values.GetValue(i));
      }
      edSvc.DropDownControl(this.dropdown);
      Value = this.dropdown.SelectedItem;
      return Value;
    }   
    return Value;
      }
  public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
  {
    return UITypeEditorEditStyle.DropDown;
  }

  private void dropdown_MouseUp(object sender ,  System.Windows.Forms.MouseEventArgs e)
  {
    if( edSvc != null && e.Button == MouseButtons.Left && this.dropdown.SelectedIndex >= 0)
    {
      edSvc.CloseDropDown();
    }
  }

}

public enum All
{
  A,
  B
}
public enum Aenum
{
  K,
  L,
  D
}
public enum Benum
{
  R,
  Y,
  P
}

#11


没必要写那么多代码吧,要实现属性间的联动,只须要在属性的set中设置就行了
比如
public enum DragFlag
{
/// <summary>
/// 拖动节点时移动节点,即删除源节点
/// </summary>
Move=0,
/// <summary>
/// 拖动节点时不删除源节点,使用复制方法
/// </summary>
Copy=1
};
private DragFlag mouseDragFlag=DragFlag.Move,mouseDragFlag1=DragFlag.Copy;

[DefaultValue(DragFlag.Move),Description("鼠标拖动选项"),Category("XmlTreeview新属性")]
public DragFlag MouseDragFlag
{
get{return mouseDragFlag;}
set{
if(mouseDragFlag!=value)
{
mouseDragFlag=value;
MouseDragFlag1=value;//此处就简单实现了联动,具体实现的办法在此处写
}
}
}
//---------------------第二属性
[DefaultValue(DragFlag.Move),Description("鼠标拖动选项"),Category("XmlTreeview新属性")]
public DragFlag MouseDragFlag1
{
get{return mouseDragFlag1;}
set{if(mouseDragFlag!=value)mouseDragFlag1=value;}
}

#12


LZ要的是设计时支持,就是设计界中在属性栏中的第一个属性值动态显示第二个属性的下拉列表

#13


http://book.csdn.net/bookfiles/337/10033713398.shtml

参考下~!

#14


to Bote_China:
在设计期的属性窗口中修改第一属性值,第二属性动态改变不需要UITypeEditor
不信你可以复制我上面代码,随便写一控件测试,所谓的连动,无非就是一个属性改变后另一属性值跟着变,那就在属性的set语句中改变另一属性值就行了

#15


最近也正想这个问题呢,

#16


路过,帮顶

#17


TO:lovevsnet()
你写的代码本没有实现LZ的要求,仔细看看LZ的要求:
当第一个属性选择A时,第二个属性的下接列表只有K,L,D三个选顶;
当第一个属性选择B时, 第二个属性的下拉列表只有R,Y,P三个选项。
注意要求中的“只有”二字,所以lovevsnet代码没有达到要求,只是不让用户选择与第一个属性相同的值。

#18


谢谢大家帮忙回贴,我会把分数都加上,特别感谢,Bote_china,lovevsnet