急!急!在线等!C# Windows Forms 中自定义TextBox控件的属性和方法。跪求!高人请进

nanjing207 2008-12-04 04:16:07
我要在C# Windows Forms 中自定义TextBox控件,按要求:(1)这个TextBox控件的最大长度为32767(int型),要求当输入的长度大于32767时TextBox就不能再输入了(不过此时可以删除);(2)另外,假设TextBox的长度为6,在粘贴数据之前TextBox中已经有1234四位数字,现在当光标位于2、3之间时我要粘贴567这个数字进TextBox(因为TextBox假设的最大长度为6),所以在粘贴数据时只能把56粘进去,数据最终变成“125634”(粘贴时光标可位于文本框任何位置)。请问高手如何实现这两个功能?
...全文
369 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
voice007 2008-12-05
  • 打赏
  • 举报
回复
mark!
ycsno1 2008-12-04
  • 打赏
  • 举报
回复
关注
owen_0075 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 HDNGO 的回复:]
我们先新建一个组件 TextBoxEx,继承于 TextBox ,增加一个 MaxByteLength 属性

C# codepublic partial class TextBoxEx : TextBox
{
public TextBoxEx()
{
InitializeComponent();
}

属性#region 属性

private int m_MaxByteLength = 0;
[Description("获取或设置用户可在文本框控件中键入或粘贴的最大字节数。0 为允许无限长度。")]

[/Quote]
顶。。
nanjing207 2008-12-04
  • 打赏
  • 举报
回复
好,谢谢你哈,帮了大忙了。
HDNGO 2008-12-04
  • 打赏
  • 举报
回复
nanjing207 2008-12-04
  • 打赏
  • 举报
回复
我在编译时,因为WM_CHAR和WM_PASTE的值没有进行设置,所以无法运行啊。
nanjing207 2008-12-04
  • 打赏
  • 举报
回复
我在编译时,因为WM_CHAR和WM_PASTE的值没有进行设置,所以无法运行啊。
HDNGO 2008-12-04
  • 打赏
  • 举报
回复
WM_CHAR消息是俘获某一个字符的消息,WM_KEYDOWN消息是俘获某一个键按下的消息
假如分别按下“q”和“shift+q”,发出的WM_KEYDOWN消息都是代表q键,而发出的WM_CHAR消息分别是“q”和“Q”

PS:俺挫。。那个地址只不过是我收藏一个地址罢了~
nanjing207 2008-12-04
  • 打赏
  • 举报
回复
请问一下12楼的牛人: HDNGO: WM_CHAR和WM_PASTE的值是多少啊?急求!
一游 2008-12-04
  • 打赏
  • 举报
回复
看了下13楼的代码可以

不过有点建意你不要自己再重写控件了,用他那代码直接在原有的TEXTBOX上就可以实现

nanjing207 2008-12-04
  • 打赏
  • 举报
回复
确实很牛啊,正在研读13楼的代码。
niitnanfeng 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 birdlonger 的回复:]
要下班了,mark 先!
[/Quote]
那么早下班了?
zhaozhijun0207 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 nanjing207 的回复:]
好,我先不结贴,真谢谢你们了。
[/Quote]

12楼是个很恐怖的牛人.
bocky2000 2008-12-04
  • 打赏
  • 举报
回复
关注
nanjing207 2008-12-04
  • 打赏
  • 举报
回复
好,我先不结贴,真谢谢你们了。
HDNGO 2008-12-04
  • 打赏
  • 举报
回复
我们先新建一个组件 TextBoxEx,继承于 TextBox ,增加一个 MaxByteLength 属性
public partial class TextBoxEx : TextBox
{
public TextBoxEx()
{
InitializeComponent();
}

属性#region 属性

private int m_MaxByteLength = 0;
[Description("获取或设置用户可在文本框控件中键入或粘贴的最大字节数。0 为允许无限长度。")]
/**//// <summary>
/// 获取或设置用户可在文本框控件中键入或粘贴的最大字节数。0 为允许无限长度。
/// </summary>
public int MaxByteLength
{
get { return m_MaxByteLength; }
set { m_MaxByteLength = value; }
}
}

然后重写 WndProc ,实现输入和粘贴的时候对字节长度进行判断
        protected override void WndProc(ref Message m)
{
//如果该属性没有设置,则允许输入
if (m_MaxByteLength == 0)
{
base.WndProc(ref m);
return;
}

switch (m.Msg)
{
case WM_CHAR:
int i = (int)m.WParam;
bool isBack = (i == (int)Keys.Back);
bool isCtr = (i == 24) || (i == 22) || (i == 26) || (i == 3);

if (isBack || isCtr)
{
//控制键不作处理
}
else
{
char c = (char)i;
if (CheckByteLengthFlow(c.ToString()))
{
break;
}
}
base.WndProc(ref m);
break;
case WM_PASTE:
IDataObject iData = Clipboard.GetDataObject();//取剪贴板对象
if (iData.GetDataPresent(DataFormats.Text)) //判断是否是Text
{
string text = (string)iData.GetData(DataFormats.Text);//取数据
if (CheckByteLengthFlow(text))
{
m.Result = (IntPtr)0;//不可以粘贴
break;
}
}
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}

/// <summary>
/// 判断即将输入的文本长度是否溢出
/// </summary>
/// <param name="text">文本</param>
/// <returns>是否溢出</returns>
private bool CheckByteLengthFlow(string text)
{
int len = GetByteLength(text); //输入的字符的长度
int tlen = GetByteLength(this.Text); //文本框原有文本的长度
int slen = GetByteLength(this.SelectedText); //文本框选中文本的长度
return (m_MaxByteLength < (tlen - slen + len));
}

/// <summary>
/// 计算文本字节长度,区分多字节字符
/// </summary>
/// <param name="text">文本</param>
/// <returns>文本字节长度</returns>
private int GetByteLength(string text)
{
return System.Text.Encoding.Default.GetBytes(text).Length;
}


另外,增加一个 RealText 属性,该属性返回具有合法长度的文本, 不会截断多字节字符
public string RealText
{
get
{
if (m_MaxByteLength == 0)
{
return this.Text;
}

if (m_MaxByteLength >= GetByteLength(this.Text))
{
return this.Text;
}

string text = this.Text;

if (string.IsNullOrEmpty(text))
{
return text;
}

char[] c = text.ToCharArray();
StringBuilder sb = new StringBuilder();
int count = 0;

for (int i = 0; i < c.Length; i++)
{
count += GetByteLength(c[i].ToString());
if (m_MaxByteLength >= count)
{
sb.Append(c[i]);
}
}

return sb.ToString();
}
}
zhaozhijun0207 2008-12-04
  • 打赏
  • 举报
回复
(1)

private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Text.Length > 32767)
{
return;
}
}


第(2)个问题,有点难度,我要获取Ctrl+V的值,现在还没找到方法.先别结贴
happymonkeycsdn 2008-12-04
  • 打赏
  • 举报
回复
关注
birdlonger 2008-12-04
  • 打赏
  • 举报
回复
要下班了,mark 先!
加载更多回复(8)

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧