简体   繁体   中英

c# Register form: Optional text boxes

I'm working on a project which requires a Register option. I have already created a form that a user can fill out and it successfully saves to the database, if every text box has been filled out. I need to have some of them be optional.

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();
        }
    }

The code above is the part of the register, where the user has the option to register a car that will be tied to their account. If they choose the add a car, they need to input the Make and the Model, while the Year is optional. If they input all the information, it successfully saves the information into the database.

However, If I try to leave the Year option blank, I get the following error: "An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Additional information: Input string was not in a correct format."

This tells me that I am most likely not allowed to leave it blank. I tried to figure out different options where I could leave it blank, and still save the other information into the database. The first option I tried came from this post: How can we declare Optional Parameters in C#.net? I tried to make the year optional, by inputting a default value to my Year parameter:

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

However I still get the same error as before. The next option I tried came from this post: How can you use optional parameters in C#? The first answer was the same as the previous one, set the parameter to a set value. Another answer further down suggested to use "System.Runtime.InteropServices" and set the parameter to [Optional]. I tried, but I get the same error as before. I figured it had to do with the fact that I try to convert and empty string to an int. A quick search led me to this post: Convert string to integer Here I am told I can try to use int.Parse, so I set it up like this

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

    }

Same error as before. Next I tried the "Int32.TryParse()" which checks if the string contains an int, if not, output an integer value

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);

    }

Now it tells me I can't convert from 'bool' to 'int'

At this point I have pretty much almost given up.

The thing that works currently, is that if every box is filled out, it successfully saves the information to the database. However, I need some of the text boxes to be optional, and I can't get that to work.

I'm sorry for the long post. I hope someone is able to help or come with a suggestion :)

Use the int.TryParse method to check if the year is a real number like this

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
}

Correct me if I'm wrong, but I think your only problem i converting text to string. Making some parameter optional isn't really necessary here.

int.TryParse() is a way to go, but you're using it wrong. TryParse returns bool which means that conversion is succeful (value true ) or not (value false ). Integer value is in out variable. So, to use it in your case, try something like this:

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));

}

if you have additional questions about "optional" parameters or additional handling of that year value, feel free to ask. Or, edit your original question.

EDIT:

To insert null or nothing into database if year == 0, you can pass parameters like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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