关于自定义属性的问题

一百减一 互信达 CTO/CIO/技术副总裁/总工程师  2005-03-02 09:05:52
我从TextBox继承后形成一个自定义的控件,加了一个属性,这个property有默认值,我怎么才能把这个控件放到窗体上后,就自动产生一行设置这个属性的代码?还有就是在我更改这个属性值的时候这行代码也会跟着改变,谢谢.代码如下,请各位给以查看.

using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;

namespace XKSys.View
{
/// <summary>
/// XKTextBox 的摘要说明。
/// </summary>
public enum TypeInputFilter
{
Int,Float,Letter,LetterOrDigit,AnyChar
}
public class XKTextBox : System.Windows.Forms.TextBox
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
TypeInputFilter inputfilter=TypeInputFilter.AnyChar;
private System.Windows.Forms.KeyPressEventHandler curEvent=null;

public XKTextBox(System.ComponentModel.IContainer container)
{
///
/// Windows.Forms 类撰写设计器支持所必需的
///
container.Add(this);
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

public XKTextBox()
{
///
/// Windows.Forms 类撰写设计器支持所必需的
///
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[DefaultValue(XKSys.View.TypeInputFilter.AnyChar)]
public TypeInputFilter InputFilter
{
get
{
return inputfilter;
}
set
{
inputfilter=value;

this.KeyPress -= this.curEvent;
if(value!=TypeInputFilter.AnyChar)
this.ImeMode=System.Windows.Forms.ImeMode.Disable;

if (inputfilter==TypeInputFilter.Int)
this.curEvent= new System.Windows.Forms.KeyPressEventHandler(this.Int_KeyPress);

if (inputfilter==TypeInputFilter.Float)
this.curEvent= new System.Windows.Forms.KeyPressEventHandler(this.Float_KeyPress);

if (inputfilter==TypeInputFilter.Letter)
this.curEvent= new System.Windows.Forms.KeyPressEventHandler(this.Letter_KeyPress);

if (inputfilter==TypeInputFilter.LetterOrDigit)
this.curEvent= new System.Windows.Forms.KeyPressEventHandler(this.LetterOrDigit_KeyPress);

this.KeyPress+=this.curEvent;
}
}
private void Int_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if ((!(Char.IsNumber(e.KeyChar))&&e.KeyChar !=8&&e.KeyChar !=13&&e.KeyChar !=27&&e.KeyChar !=46)||e.KeyChar=='.')
{
e.Handled = true;
}
}


private void Float_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if (!(Char.IsNumber(e.KeyChar)) &&e.KeyChar !=8&&e.KeyChar !=13&&e.KeyChar !=27&&e.KeyChar !=46)
{
e.Handled = true;
}
}

private void Letter_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if ((!(Char.IsLetter(e.KeyChar))&&e.KeyChar !=8&&e.KeyChar !=13&&e.KeyChar !=27&&e.KeyChar !=46)||e.KeyChar=='.')
{
e.Handled = true;
}
}

private void LetterOrDigit_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if ((!(Char.IsLetterOrDigit(e.KeyChar))&&e.KeyChar !=8&&e.KeyChar !=13&&e.KeyChar !=27&&e.KeyChar !=46)||e.KeyChar=='.')
{
e.Handled = true;
}
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}
...全文
306 点赞 收藏 15
写回复
15 条回复
Jim3 2005年03月02日
帮助里说的比较清楚,还是看帮助吧

可能是你的缓存里的dll没有更新,或者你试验方法有误
回复 点赞
一百减一 2005年03月02日
我自己搞好了,为什么把那两行
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[DefaultValue(XKSys.View.TypeInputFilter.AnyChar)]

都去了就可以了呢.谁有关于这些标记的含义,能给我的讲一下吗?

奇怪了,我昨天就刚开始什么也没有写,就是不出来,今天把那些东西都去掉就出来了.怪,人生就是这么怪!!
回复 点赞
Jim3 2005年03月02日
这样修改就可以了,可能是你的缓存里的dll没有更新

去掉那个控件,重新加载,试试

回复 点赞
一百减一 2005年03月02日
to lyvvvv(lyvvvv) :
谢谢你的热心,我也用inputfilter来保存InputFilter属性的值了,但是就是实现不了我想要的效果.请问是怎么回事,你的代码能实现IDE自动生成代码的效果吗?
回复 点赞
lyvvvv 2005年03月02日
我明白你的意思,一般而言,属性还要另外设一个变量保存的,你看下面的代码中mMsg这个属性,这段代码是我自定义一个组合控件(textbox+combobox+textbox)的属性设定的代码:
private string _NoField;
private string _NoFieldCn;
private string _NameField;
private bool _bMsg=false;
private string _TableName;
/// <summary>
/// 获取或设置当前控件对应的表的名称
/// </summary>
public string mTableName
{
get{return _TableName;}
set{_TableName=value;}
}
/// <summary>
/// 获取或设置编号栏位所对应的字段名称
/// </summary>
public string mNoField
{
get{return _NoField;}
set{_NoField=value;}
}
/// <summary>
/// 获取或设置编号栏所对应的字段中文名称
/// </summary>
public string mNoFieldCn
{
get{return _NoFieldCn;}
set{_NoFieldCn=value;}
}
/// <summary>
/// 获取或设置在编号输入错误的情况下,控件失去焦点,是否弹出提示框
/// </summary>
public bool mMsg
{
get{return _bMsg;}
set
{
if(this.mNoFieldCn == "" && value==true)
{
MessageBox.Show("请先设定mNoFieldCn的值!","ComboxNoName控件属性设定",MessageBoxButtons.OK ,MessageBoxIcon.Information);
return;
}
_bMsg=value;
}
}
回复 点赞
一百减一 2005年03月02日
to lyvvvv(lyvvvv) :
你说的如果是不能或者不需要在设计时修改的话倒是可以的,但是我在设计时修改属性,就不能保存了,因为没有产生代码呀.所以在设计时修改属性就没有用了.
回复 点赞
一百减一 2005年03月02日
我这里没有出来,你帮忙再看看吧.我急着用!谢谢Jim3(Jim)
回复 点赞
lyvvvv 2005年03月02日
你在构造函数里可以给属性一个默认值。
在SET里改变它就可以了。
不见得一定要自动产生一行代码才能达到你的效果。
回复 点赞
Jim3 2005年03月02日
修改后就会出来了
回复 点赞
一百减一 2005年03月02日
to Jim3(Jim):

我按照你说的做了,但是还没有出来呀.
回复 点赞
一百减一 2005年03月02日
UP一下吧.忘记了,谢谢sutalon(神州无敌)了!
回复 点赞
Jim3 2005年03月02日
去掉这句
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
回复 点赞
一百减一 2005年03月02日
但是就是放在窗体上没有产生那行设置InputFilter的代码,而且,在属性框里改也不能产生相应代码,在运行时修改运行的结果还是对的,我想在设计时也实现了,就不用在运行时设置了.帮帮忙吧.
回复 点赞
sutalon 2005年03月02日
我觉得你上面写的代码可以实现你要求的功能阿!!
回复 点赞
一百减一 2005年03月02日
我后虽的属性就是InputFilter,请各位高手给以指教.谢谢
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告