Validation Helper Class
Fri Mar 15 2024 05:55:12 GMT+0000 (Coordinated Universal Time)
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace CarMaintenanceAppointment
{
public partial class AppointmentForm : Form
{
public AppointmentForm()
{
InitializeComponent();
}
private void btnPrefill_Click(object sender, EventArgs e)
{
// Pre-fill the form with some valid data
txtCustomerName.Text = "John Doe";
txtAddress.Text = "123 Main St";
txtCity.Text = "Toronto";
txtProvince.Text = "ON";
txtPostalCode.Text = "A1A 1A1";
txtEmail.Text = "johndoe@example.com";
txtHomePhone.Text = "123-456-7890";
txtCellPhone.Text = "987-654-3210";
txtMakeModel.Text = "Toyota Camry";
txtYear.Text = "2019";
dtpAppointmentDate.Value = DateTime.Now;
}
private void btnBookAppointment_Click(object sender, EventArgs e)
{
// Reset error label
lblErrors.Text = "";
// Validate input fields
List<string> errors = new List<string>();
// Validation rules
if (string.IsNullOrWhiteSpace(txtCustomerName.Text))
errors.Add("Customer name is required.");
if (string.IsNullOrWhiteSpace(txtEmail.Text) && string.IsNullOrWhiteSpace(txtAddress.Text) && string.IsNullOrWhiteSpace(txtCity.Text) && string.IsNullOrWhiteSpace(txtProvince.Text) && string.IsNullOrWhiteSpace(txtPostalCode.Text))
errors.Add("Postal information is required if email is not provided.");
if (!string.IsNullOrWhiteSpace(txtProvince.Text) && (txtProvince.Text.Length != 2 || !ValidationHelper.IsValidProvinceCode(txtProvince.Text)))
errors.Add("Province code is invalid.");
if (!string.IsNullOrWhiteSpace(txtPostalCode.Text) && !ValidationHelper.IsValidPostalCode(txtPostalCode.Text))
errors.Add("Postal code is invalid.");
if (string.IsNullOrWhiteSpace(txtHomePhone.Text) && string.IsNullOrWhiteSpace(txtCellPhone.Text))
errors.Add("Either home or cell phone must be provided.");
if (!string.IsNullOrWhiteSpace(txtEmail.Text) && !IsValidEmail(txtEmail.Text))
errors.Add("Email is invalid.");
if (string.IsNullOrWhiteSpace(txtMakeModel.Text))
errors.Add("Make & model is required.");
if (!string.IsNullOrWhiteSpace(txtYear.Text) && (!int.TryParse(txtYear.Text, out int year) || year < 1900 || year > DateTime.Now.Year + 1))
errors.Add("Year is invalid.");
if (dtpAppointmentDate.Value.Date < DateTime.Today)
errors.Add("Appointment date cannot be in the past.");
// Display errors if any
if (errors.Count > 0)
{
lblErrors.ForeColor = System.Drawing.Color.Red;
lblErrors.Text = string.Join("\n", errors);
FocusFirstErrorControl();
return;
}
// Format and save appointment data to file
string appointmentData = $"{ValidationHelper.Capitalize(txtCustomerName.Text)}|{ValidationHelper.Capitalize(txtAddress.Text)}|{ValidationHelper.Capitalize(txtCity.Text)}|{txtProvince.Text.ToUpper()}|{FormatPostalCode(txtPostalCode.Text)}|{txtEmail.Text.ToLower()}|{FormatPhoneNumber(txtHomePhone.Text)}|{FormatPhoneNumber(txtCellPhone.Text)}|{ValidationHelper.Capitalize(txtMakeModel.Text)}|{txtYear.Text}|{dtpAppointmentDate.Value.ToString("yyyy-MM-dd")}";
try
{
using (StreamWriter writer = new StreamWriter("appointments.txt", true))
{
writer.WriteLine(appointmentData);
}
MessageBox.Show("Appointment booked successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
ResetForm();
}
catch (Exception ex)
{
MessageBox.Show($"An error occurred while saving the appointment: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnReset_Click(object sender, EventArgs e)
{
// Reset the form
ResetForm();
}
private void btnClose_Click(object sender, EventArgs e)
{
// Close the form
Close();
}
private bool IsValidEmail(string email)
{
try
{
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch
{
return false;
}
}
private void FocusFirstErrorControl()
{
// Set focus to the first control with an error
foreach (Control control in this.Controls)
{
if (control.GetType() == typeof(TextBox) && !string.IsNullOrEmpty(control.Text))
{
control.Focus();
return;
}
}
}
private string FormatPostalCode(string postalCode)
{
// Format postal code with a single space
return postalCode.ToUpper().Trim().Insert(3, " ");
}
private string FormatPhoneNumber(string phoneNumber)
{
// Format phone number with dashes
return Regex.Replace(phoneNumber, @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");
}
private void ResetForm()
{
// Reset the form to its original state
txtCustomerName.Text = "";
txtAddress.Text = "";
txtCity.Text = "";
txtProvince.Text = "";
txtPostalCode.Text = "";
txtEmail.Text = "";
txtHomePhone.Text = "";
txtCellPhone.Text = "";
txtMakeModel.Text = "";
txtYear.Text = "";
dtpAppointmentDate.Value = DateTime.Now;
lblErrors.Text = "";
}
}
public static class ValidationHelper
{
public static string Capitalize(string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
string[] words = input.Trim().ToLower().Split(' ');
for (int i = 0; i < words.Length; i++)
{
if (words[i].Length > 1)
{
words[i] = char.ToUpper(words[i][0]) + words[i][1..];
}
else if (words[i].Length == 1)
{
if (i == 0)
words[i] = char.ToUpper(words[i][0]).ToString();
else
words[i] = words[i].ToString();
}
}
return string.Join(" ", words);
}
public static bool IsValidProvinceCode(string provinceCode)
{
if (string.IsNullOrEmpty(provinceCode))
return false;
// Array of valid Canadian province codes
string[] validCodes = { "AB", "BC", "MB", "NB", "NL", "NS", "NT", "NU", "ON", "PE", "QC", "SK", "YT" };
return Array.Exists(validCodes, code => code.Equals(provinceCode, StringComparison.OrdinalIgnoreCase));
}
public static bool IsValidPostalCode(string postalCode)
{
if (string.IsNullOrEmpty(postalCode))
return false;
// Regular expression to match Canadian postal code pattern
Regex regex = new Regex(@"^[a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d$");
return regex.IsMatch(postalCode);
}
}
}
assignment 2 of programming concepts-2
https://chat.openai.com/c/bf7e0b9b-404d-4d95-8b4b-95d8d70c6681


Comments