C# 从TextBox类派生类

C# 从TextBox类派生类,c#,asp.net,C#,Asp.net,我试图从TextBox类派生一个名为NumBox的自定义类,并为此类创建一个setter和getter,但当我运行程序时,我得到一个运行时异常“FormatException未被用户代码处理”。在我看来,这与此有关。Text不是整数,但我程序的输入是int。错误发生在以下行:return Convert.ToInt16(this.Text) 谢谢你的帮助 请在下面找到我的代码: default.aspx <%@ Page Language="C#" AutoEventWireup="tru

我试图从TextBox类派生一个名为NumBox的自定义类,并为此类创建一个setter和getter,但当我运行程序时,我得到一个运行时异常“FormatException未被用户代码处理”。在我看来,这与此有关。Text不是整数,但我程序的输入是int。错误发生在以下行:
return Convert.ToInt16(this.Text)

谢谢你的帮助

请在下面找到我的代码: default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <glm:numbox ID="NumBox1" runat="server" Style="position: relative" />
        <asp:Button ID="Button_SquareIt" runat="server" Style="position: relative" 
            Text="Square It" onclick="Button_SquareIt_Click" />
    </div>
    </form>
</body>
</html>
请尝试以下操作:

    public int Num {
        set {
            this.Text = value.ToString();
        }
        get {
            return Int16.Parse(this.Text);
        }
    }
我建议使用
TryParse
方法来确保您只尝试解析实际数字。请注意,如果您的
文本
属性
为空
,则Parse和TryParse将引发异常。您应该测试空值,如果为空,则返回
0
或使属性返回
可为空

此外,还应该解析为返回的类型。在解析
Int16
时,属性返回
int
,请尝试以下操作:

    public int Num {
        set {
            this.Text = value.ToString();
        }
        get {
            return Int16.Parse(this.Text);
        }
    }
我建议使用
TryParse
方法来确保您只尝试解析实际数字。请注意,如果您的
文本
属性
为空
,则Parse和TryParse将引发异常。您应该测试空值,如果为空,则返回
0
或使属性返回
可为空


此外,还应该解析为返回的类型。解析
Int16
时,属性返回
int
。好的,我已经详细研究了这个问题,找到了问题的原因

创建一个新的NumBox实例,然后对其执行操作。您没有引用在页面上创建的实例

如果您没有关联的designer.cs文件,那么这应该可以:

public partial class _Default : System.Web.UI.Page
{
    GLM.NumBox NumBox1;
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button_SquareIt_Click(object sender, EventArgs e)
    {
       NumBox1.Num = NumBox1.Num *  NumBox1.Num;
    }
}

如果您确实有一个关联的designer.cs文件,那么请删除NumBox1的声明。

好的,我已经详细研究了这个问题,并找到了问题的原因

创建一个新的NumBox实例,然后对其执行操作。您没有引用在页面上创建的实例

如果您没有关联的designer.cs文件,那么这应该可以:

public partial class _Default : System.Web.UI.Page
{
    GLM.NumBox NumBox1;
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button_SquareIt_Click(object sender, EventArgs e)
    {
       NumBox1.Num = NumBox1.Num *  NumBox1.Num;
    }
}

如果您确实有一个关联的designer.cs文件,那么请删除NumBox1的声明。

为了补充这一点,您可以使用Int64.TryParse(…)来测试它是否是有效的Int16。这与我当前在程序no@Azzi中的代码完全相同。。。您有
返回Convert.ToInt16(this.Text)为了补充这一点,您可以使用Int64.TryParse(…)来测试它是否是有效的Int16。这与我目前在程序no@Azzi中使用的代码完全相同。。。您有
返回Convert.ToInt16(this.Text)这就是引发异常的原因,输入是integerApologies,我在您的默认类定义中遗漏了一行。我已经对我的回复进行了相应的编辑。谢谢您的关注,您能更详细地解释一下问题是什么吗。如果我添加您的代码,我会得到以下错误:“\u Default.NumBox1”和“\u Default.NumBox1”之间的错误2含糊不清这是因为您有一个设计器文件,只需删除GLM.NumBox NumBox1行,就可以了。要更详细地解释这个问题。。。在aspx页面中创建一个名为NumBox1的NumBox实例,这实际上就是您在页面中看到的框。然后,在您的代码隐藏(默认值的类定义)中定义并实例化一个新的NumBox,并将其称为n。这不是您在页面中看到的numbox。然后设置n的Num属性,该属性的Text属性将设置为空字符串,这将导致错误。这就是引发异常的原因,输入是integerApologies,我在您的默认类定义中遗漏了一行。我已经对我的回复进行了相应的编辑。谢谢您的关注,您能更详细地解释一下问题是什么吗。如果我添加您的代码,我会得到以下错误:“\u Default.NumBox1”和“\u Default.NumBox1”之间的错误2含糊不清这是因为您有一个设计器文件,只需删除GLM.NumBox NumBox1行,就可以了。要更详细地解释这个问题。。。在aspx页面中创建一个名为NumBox1的NumBox实例,这实际上就是您在页面中看到的框。然后,在您的代码隐藏(默认值的类定义)中定义并实例化一个新的NumBox,并将其称为n。这不是您在页面中看到的numbox。然后设置n的Num属性,该属性的Text属性将设置为空字符串,这将导致错误。
public partial class _Default : System.Web.UI.Page
{
    GLM.NumBox NumBox1;
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button_SquareIt_Click(object sender, EventArgs e)
    {
       NumBox1.Num = NumBox1.Num *  NumBox1.Num;
    }
}