繁体   English   中英

c#注册表格:可选文本框

[英]c# Register form: Optional text boxes

我正在一个需要注册选项的项目中。 我已经创建了一个表单,供用户填写,如果每个文本框均已填写,则该表单可以成功保存到数据库中。 我需要其中一些是可选的。

private void button1_Click(object sender, EventArgs e)
    {

        Registercar(textBox1.Text, textBox2.Text, Convert.ToInt32(textBox3.Text));
    }

    private static void Registercar(string make, string model, int year)
    {
        var con = GetConnection();
        try
        {
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "INSERT INTO user_car (ID,make,model,year) VALUE (@ID, @make, @model, @year)";
            cmd.Prepare();
            cmd.Parameters.AddWithValue("@ID", 0);
            cmd.Parameters.AddWithValue("@make", make);
            cmd.Parameters.AddWithValue("@model", model);
            cmd.Parameters.AddWithValue("@year", year);
            cmd.ExecuteNonQuery();
            if (con !=null) { con.Close(); };

            MessageBox.Show("Car successfully registered");
        }
        catch (Exception ex)
        {
            MessageBox.Show(Convert.ToString(ex));
        }
        finally
        {
            con.Close();
        }
    }

上面的代码是注册的一部分,用户可以选择注册与自己的帐户相关联的汽车。 如果选择添加汽车,则需要输入品牌和型号,而年份是可选的。 如果他们输入了所有信息,它将成功地将信息保存到数据库中。

但是,如果我尝试将Year选项保留为空白,则会出现以下错误:“ mscorlib.dll中发生了'System.FormatException'类型的未处理异常

其他信息:输入字符串的格式不正确。”

这告诉我,很可能不允许我将其留空。 我试图找出其他选项,可以将其留空,而仍将其他信息保存到数据库中。 我尝试的第一个选项来自这篇文章: 我们如何在C#.net中声明可选参数? 我试图通过向Year参数输入默认值来使year为可选:

private static void Registercar(string make, string model, int year = 0)

但是我仍然得到和以前一样的错误。 我尝试的下一个选项来自这篇文章: 如何在C#中使用可选参数? 第一个答案与前一个答案相同,将参数设置为设定值。 进一步的答案是建议使用“ System.Runtime.InteropServices”并将参数设置为[Optional]。 我尝试过,但收到的错误与以前相同。 我认为这与我尝试将字符串转换为空并转换为int有关。 快速搜索将我带到了这篇文章: 将字符串转换为整数在这里,我被告知可以尝试使用int.Parse,因此我将其设置为

private void button1_Click(object sender, EventArgs e)
    {
        int year = int.Parse(textBox3.Text.Trim());
        Registercar(textBox1.Text, textBox2.Text, year);

    }

与以前相同的错误。 接下来,我尝试了“ Int32.TryParse()”,它检查字符串是否包含int,如果不包含,则输出整数值

private void button1_Click(object sender, EventArgs e)
    {
        int year;
        string str = textBox3.Text.Trim();
        Registercar(textBox1.Text, textBox2.Text, Int32.TryParse(str, out year);

    }

现在它告诉我我不能从'bool'转换为'int'

在这一点上,我几乎已经放弃了。

当前有效的是,如果每个框都填写完毕,它将成功地将信息保存到数据库中。 但是,我需要一些文本框是可选的,而我无法使其正常工作。

很长的帖子对不起。 我希望有人能够提供帮助或提出建议:)

使用int.TryParse方法检查年份是否为像这样的实数

int nYear=0;
if(int.TryParse(txtYear.Text, out nYear)
{
    //the value is a number
    //Also the nYear vairable has the numeric integer value
    //    you can use it
}
else
{
    //The value isn't a number
}

如果我错了,请纠正我,但是我认为您唯一的问题就是将文本转换为字符串。 此处实际上并不需要将某些参数设置为可选。

int.TryParse()是一种解决方法,但是使用错误。 TryParse返回bool ,表示转换成功(值为true )或不成功(值为false )。 整数值是在out可变的。 因此,要在您的情况下使用它,请尝试以下操作:

private void button1_Click(object sender, EventArgs e)
{
    int year;
    string str = textBox3.Text.Trim();
    //if parsing isn't successful, year will be set as 0
    if (!int.TryParse(str, out year))
    {
        //notice user that that isn't correct value for year
        year = 0;
    }
    //no need for else, year now contains int value but beware, it can be value from 0  to 2147483647

    Registercar(textBox1.Text, textBox2.Text, year));

}

如果您对“可选”参数或该year价值的其他处理有其他疑问,请随时提出。 或者,编辑您的原始问题。

编辑:

要在year == 0时向数据库中插入nullnothing插入,可以传递如下参数:

if (year != 0)
    cmd.Parameters.AddWithValue("@year", year);
else
    cmd.Parameters.AddWithValue("@year", DBNull.Value);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM