.net下的C#中的winform编程时,用户控件的属性问题(困扰几个月的问题,一直没有得到答案,难道是BUG)

smking 2008-09-16 05:32:58
步骤1:生成一个windows窗体。默认解决方案为:windowsapplication***,窗体默认为Form1
步骤2:在这个解决方案中添加一个用户控件,默认为:UserControl1。
步骤3:在这个用户控件中添加一个TextBox控件,默认其名为:textBox1。
步骤4:在解雇控件的代码中加入一个属性,如下所示:
public UserControl1()
{
InitializeComponent();
}

public int m_test
{
set
{ textBox1.Text = value.ToString(); }
get
{ return int.Parse(textBox1.Text); }
}
步骤5:生成这个用户控件,并把它拖入到Form1窗体之中。点击生成解决方案,问题出现了,弹出一个对话框说:属性“m_test”的代码生成失败。错误是:“对象userControl1上的属性访问器“m_test”发生以下异常:“输入字符串的格式不正确””。

附注说明:
这个问题不是每次编译都会出现的,你可以把这个userControl1先移除,再生成这个控件,然后再拖回到Form1窗体之中,一般都会出现。我现在用的解决办法是在用户控件之中,给textBox加入一个默认值,则不会再弹出错误提示,但是这显示不是一个好的解决办法。
...全文
443 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
llxzj60 2008-09-17
  • 打赏
  • 举报
回复

return int.Parse(textBox1.Text)之前加上判断textBox1.Text为数字
smking 2008-09-17
  • 打赏
  • 举报
回复
非常感谢各位的解答,我基本上是明白了,第一次发贴就有这么多人回复,谢谢啦!
接分.
HowkWolf 2008-09-16
  • 打赏
  • 举报
回复
代码健壮性方面上面的说的很多了
C#本身的编译是没那么多校验的的,只是进行简单的词法分析,主要是在你编译用户控件后,在你在工具箱上拖到窗体上的时候这一过程IDE自动初始化用户控件,并读取一些属性到属性窗口,这个时候IDE会校验你的Get属性,此事抛异常的原因上面说了,我不多说,整个过程的原理就是这样的。
twobug 2008-09-16
  • 打赏
  • 举报
回复
如果你不用IDE,相信你的代码是可以正常编译的,但你要是使用IDE,IDE会自动做一些控件的属性获取动作,你调试应该是调试不到的,因为你还没有运行程序呢。

你可以加一些代码来做设计时的控制,DesignMode这个属性是表示当前是否是设计时的

get {
if(!DesignMode)
return int.Parse(textBox1.Text);
else
return 0;
}



当然你的代码确实不够健壮才是主要原因
JeffChung 2008-09-16
  • 打赏
  • 举报
回复
get那里执行不到的.
用tryparse
zhujiechang 2008-09-16
  • 打赏
  • 举报
回复
不要直接这样,int.Parse(textBox1.Text);这个肯定发生错误,尤其是你摆在窗体上时,建议你加个try或者用tryparse
卧_槽 2008-09-16
  • 打赏
  • 举报
回复
执行不到的。
smking 2008-09-16
  • 打赏
  • 举报
回复
各位大侠,请讲一讲程序是如何执行到那个Get{}语句的,我在Get{}语句处加入了断点,单步执行也没有执行到那一步啊,各位大侠,救救我啊!
卧_槽 2008-09-16
  • 打赏
  • 举报
回复
控件从工具箱拖动到用户窗口,即Vs中的winform窗体上时,vs编译环境为了可视化显示控件,会与执行部分代码,其执行空间在.net安装目录下。所以代买中没有bug,但是在执行时会出现异常时,由于出现异常的代码设计界面,属性,方法的构建,那么就会在编译环境中出现这样的异常提醒,但是工程仍然能够编译通过。
周公 2008-09-16
  • 打赏
  • 举报
回复
textBox1.Text在初始化的时候没有赋值,导致int.Parse()方法产生异常。
要么给textBox1.Text先赋值
要么用typParse方法取值

就是这个 原因。
smking 2008-09-16
  • 打赏
  • 举报
回复
首先很感谢你这么短时间内的回复,你说的意思我明白,出现的错误也说明它是由于在Parse时出错。
那么就再延伸一个问题:
此处并没有执行Public int m_test{}的取值操作,怎么会出现转换的错误问题,谁能把这个机制讲一讲,此处是一个属性而不是一个私有变量,所以在实例化解雇控件时,也不会执行到get{}语句啊!请解释一下为什么?谢谢!
downmoon 2008-09-16
  • 打赏
  • 举报
回复
给你一些Int处理方法
#region Int
public static int IntParse(string old)
{ return IntParse(old, 0); }
public static int IntParse(string old, int NullValue)
{
int i = 0;
try
{
if (old != null && old.ToString().IndexOf('.') > 0)
{
string str = old.Trim().Remove(old.ToString().IndexOf('.'));
i = int.Parse(str.Trim());
}
else { i = int.Parse(old.ToString().Trim()); }
}
catch { try { i = NullValue; } catch { i = 0; } }
return i;
}
public static int IntParse(object old)
{ return IntParse(old, 0); }
public static int IntParse(object old, int NullValue)
{
int i = 0;
try
{
if (old != null && old.ToString().IndexOf('.') > 0)
{
string str = old.ToString().Remove(old.ToString().IndexOf('.'));
i = int.Parse(str.Trim());
}
else { i = int.Parse(old.ToString().Trim()); }
}
catch { try { i = NullValue; } catch { i = 0; } }
return i;
}
public static int IntTryParse(object srcObj)
{
int defaultValue;
if (srcObj == null) { return 0; }
Int32.TryParse(srcObj.ToString(), out defaultValue);
return defaultValue;
}
public static int IntTryParse(object srcObj, int NullValue)
{
int defaultValue;
////if (srcObj == null) { return 0; }
if (!Int32.TryParse(srcObj.ToString(), out defaultValue)) { Int32.TryParse(NullValue.ToString(), out defaultValue); }
return defaultValue;
}
#endregion
优途科技 2008-09-16
  • 打赏
  • 举报
回复
我看是、
卧_槽 2008-09-16
  • 打赏
  • 举报
回复
textBox1.Text在初始化的时候没有赋值,导致int.Parse()方法产生异常。
要么给textBox1.Text先赋值
要么用typParse方法取值

111,086

社区成员

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

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

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