首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

用户控件使用控件编辑其值(使用DropDownControl(ctl)方法)怎么向ctl赋初始值

2012-01-02 
用户控件使用控件编辑其值(使用DropDownControl(ctl)方法)如何向ctl赋初始值?我想写一个用户控件,这个控件

用户控件使用控件编辑其值(使用DropDownControl(ctl)方法)如何向ctl赋初始值?
我想写一个用户控件,这个控件有一个属性如下:
 
  [Description("设置X的位移量"), DefaultValue(50), Editor(typeof(UITypeEditorOffset), typeof(System.Drawing.Design.UITypeEditor))]
  public int OffetX
  {
  get{return this._OffsetX;}
  set {
  this._OffsetX = value;
  this.Refresh();
  }
  }
   

  其中类UITypeEditorOffset代码如下:
  public class UITypeEditorOffset : UITypeEditor
  {
  public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
  {
  if (context != null && context.Instance != null)
  {
  return UITypeEditorEditStyle.DropDown;
  }

  return base.GetEditStyle(context);
  }

  public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
  {
  IWindowsFormsEditorService iService = null  
  if (context != null && context.Instance != null && provider != null)
  {
  iService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
  if (iService != null)
  {
  System.Windows.Forms.TrackBar trkOffset = new System.Windows.Forms.TrackBar();
   
  // 在这里如何初始化 trkOffset 的 Value 属性呢? 也就是说如何将上面的 OffetX 传递过来呢?
   
  trkOffset.ValueChanged += new System.EventHandler(this.trkOffset_ValueChanged);
  iService.DropDownControl(trk);
   
  // 如何让 trkOffset 在滑块滑动时就返回值呢?
  }
  }

  return value;
  }

  private void trkOffset_ValueChanged(Object sender, System.EventArgs e)
  {
  ..........
  }

  }

  我想用 System.Windows.Forms.TrackBar 这个控件来编辑OffsetX属性值,每次点击属性浏览器中该属性右侧向下箭头的时候会显示TrackBar控件,但是每次显示TrackBar的时候如何让TrackBar的Value值为上次编辑完毕的值呢(也就是如何初始TrackBar的Value值)?还有当TrackBar滑动滑块时如何让其当前值立即返回(不是等到TrackBar控件消失才返回)? 我的控件是想非常直观的显示效果(每次OffsetX值改变都会重新绘制自身外观)。

 希望高手指点迷津,万分感谢!




[解决办法]
参考如下:

C# code
public class UITypeEditorOffset : UITypeEditor{    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)    {        if (context != null && context.Instance != null)        {            return UITypeEditorEditStyle.DropDown;        }        return base.GetEditStyle(context);    }    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)    {        IWindowsFormsEditorService iService = null;        if (context != null && context.Instance != null && provider != null)        {            iService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));            if (iService != null)            {                [color=#FF0000]用户控件[/color] control = ([color=#FF0000]用户控件[/color])context.Instance;                TrackBar trkOffset = new TrackBar();                trkOffset.Value = control.OffetX;                iService.DropDownControl(trkOffset);                return trkOffset.Value;            }        }        return value;    }}
------解决方案--------------------


最好的做法是:

C# code
public class AxTrackBar : TrackBar{    public AxTrackBar() { }        public AxTrackBar(int value)    {        base.Value = value;    }}
[解决办法]
1. 用户控件.ReferenceObjectType 应在用户控件初始化时赋初始值, 另外, iService.DropDownControl(editor) 属性编辑器(editor)也应该有对应ReferenceObjectType类型的字段, 初始化editor请参照3L...

2. 实时返回 TrackBar.Value 的做法是不合理的, 万一目标机器太慢, 会造成严重的闪烁. 若要坚持, 参考如下:

C# code
public class 用户控件 : UserControl{    ReferenceObjectType _OffsetX;    /// <summary>    /// 初始化项.    /// </summary>    public 用户控件()    {        //Initialize _OffsetX..    }    [    Editor(typeof(UITypeEditorOffset), typeof(UITypeEditor))    ]    public ReferenceObjectType OffetX    {        get { return this._OffsetX; }        set { this._OffsetX = value; }    }    /// <summary>    /// 实时重绘.    /// </summary>    internal void Redraw()    {        base.Invalidate();    }}
[解决办法]
用户控件:

C# code
/// <summary>/// 实时重绘./// </summary>internal void Redraw(ReferenceObjectType offsetX){    this._OffsetX = offsetX; base.Invalidate();}
[解决办法]
关于闪烁现象我在9L提过, 这是.Net毛病, 还没有较好的解决方案...

大家共同进步...

^ō^

热点排行