2021-01-23 23:36:52 -05:00
using System ;
using System.ComponentModel ;
2021-01-27 17:09:40 -05:00
using System.Text.RegularExpressions ;
2021-01-23 23:36:52 -05:00
using System.Windows.Forms ;
2021-01-26 00:20:13 -05:00
using GreatHomeChildcare.Models ;
2021-01-23 23:36:52 -05:00
namespace GreatHomeChildcare
{
public partial class frmGuardianCrud : Form
{
2021-01-26 00:20:13 -05:00
//global variables
SqliteDataAccess SqliteDataAccess = new SqliteDataAccess ( ) ;
2021-01-27 17:09:40 -05:00
public static Guardian guardian = new Guardian ( ) ;
2021-01-26 00:20:13 -05:00
public static string strPin = String . Empty ;
enum IsAdmin
{
No = 0 ,
Yes = 1
}
2021-01-23 23:36:52 -05:00
public frmGuardianCrud ( )
{
InitializeComponent ( ) ;
}
2021-01-26 00:20:13 -05:00
/ * Load up the form with an existing guardian
* if the "edit guardian" button was pressed
* on the child crud form .
* /
private void frmGuardianCrud_Load ( object sender , EventArgs e )
{
2021-01-27 17:09:40 -05:00
int guardian_id = 0 ;
IsAdmin adminOut ;
2021-01-26 00:20:13 -05:00
FillIsAdminComboBox ( ) ;
2021-01-27 17:09:40 -05:00
/ * If it ' s the first time run of this program
* then setup the initial admin user .
* /
2021-01-30 01:12:50 -05:00
if ( SqliteDataAccess . GetNumAdmins ( ) < = 0 )
2021-01-27 17:09:40 -05:00
{
isAdminComboBox . SelectedItem = IsAdmin . Yes ;
isAdminComboBox . Enabled = false ;
2021-01-27 17:58:27 -05:00
btnCancelClose . Enabled = false ;
2021-01-27 17:09:40 -05:00
}
else
{
guardian_id = frmChildCrud . guardian_id ;
}
2021-01-26 00:20:13 -05:00
if ( guardian_id > 0 )
{
guardian = SqliteDataAccess . GetGuardianById ( guardian_id ) ;
idNumericUpDown . Value = guardian . id ;
lastNameTextBox . Text = guardian . LastName ;
firstNameTextBox . Text = guardian . FirstName ;
phoneNumberNumericUpDown . Value = guardian . PhoneNumber ;
emailAddressTextBox . Text = guardian . EmailAddress ;
strPin = guardian . PinNumber . ToString ( ) ;
2021-01-27 17:58:27 -05:00
tbPinNumber . Text = "****" ;
2021-01-26 00:20:13 -05:00
//Load the isAdmin combo box based from enum value.
//ref: chuck costarella
Enum . TryParse < IsAdmin > ( guardian . isAdmin . ToString ( ) , out adminOut ) ;
isAdminComboBox . SelectedItem = adminOut ;
}
}
// Fill the IsAdmin combo box with our enum.
private void FillIsAdminComboBox ( )
{
isAdminComboBox . Items . Add ( IsAdmin . No ) ;
isAdminComboBox . Items . Add ( IsAdmin . Yes ) ;
isAdminComboBox . SelectedItem = IsAdmin . No ;
}
//Close the form without saving changes.
private void btnCancelClose_Click ( object sender , EventArgs e )
{
Close ( ) ;
}
/ * Save a new guardian or update
* an existing guardian .
* INPUT : Data from form .
* OUTPUT : data to sql database .
* /
private void btnSaveClose_Click ( object sender , EventArgs e )
{
2021-01-30 00:17:26 -05:00
Guardian checkExistingGuardian = new Guardian ( ) ;
2021-01-30 01:12:50 -05:00
int num_admins ;
2021-01-27 17:09:40 -05:00
this . Validate ( ) ;
2021-01-27 17:58:27 -05:00
this . ValidateChildren ( ) ;
2021-01-27 17:09:40 -05:00
// Check to see if any control is in error.
foreach ( Control c in errorProvider1 . ContainerControl . Controls )
{
if ( errorProvider1 . GetError ( c ) ! = "" )
{
MessageBox . Show ( "Guardian not saved due to errors on the form!" , "Great Home Childcare" , MessageBoxButtons . OK , MessageBoxIcon . None ) ;
return ;
}
}
2021-01-30 15:53:08 -05:00
// validate pin
if ( strPin . Length < 4 )
{
MessageBox . Show ( "Please enter a 4-digit pin number." , "Great Home Childcare" , MessageBoxButtons . OK , MessageBoxIcon . None ) ;
return ;
}
2021-01-30 00:17:26 -05:00
checkExistingGuardian = SqliteDataAccess . GetGuardianByPin ( Int32 . Parse ( strPin ) ) ;
2021-01-30 01:12:50 -05:00
//If this is a new guardian, check to see if that pin is in use.
if ( idNumericUpDown . Value = = 0 & & checkExistingGuardian ! = null )
2021-01-30 00:17:26 -05:00
{
MessageBox . Show ( "Please choose a different PIN number." , "Great Home Childcare" , MessageBoxButtons . OK , MessageBoxIcon . None ) ;
return ;
}
2021-01-27 17:09:40 -05:00
guardian . id = Int32 . Parse ( idNumericUpDown . Value . ToString ( ) ) ;
guardian . LastName = lastNameTextBox . Text ;
guardian . FirstName = firstNameTextBox . Text ;
guardian . PhoneNumber = long . Parse ( phoneNumberNumericUpDown . Value . ToString ( ) ) ;
guardian . EmailAddress = emailAddressTextBox . Text ;
guardian . PinNumber = Int32 . Parse ( strPin ) ;
2021-01-27 17:58:27 -05:00
if ( guardian . id = = 0 ) // new guardian
{
SqliteDataAccess . InsertNewGuardian ( guardian ) ;
}
else
{
2021-01-30 01:12:50 -05:00
//Check to see if no admins will be left over.
num_admins = SqliteDataAccess . GetNumAdmins ( ) ;
num_admins - - ;
if ( ( IsAdmin ) isAdminComboBox . SelectedItem = = IsAdmin . No
& & num_admins < = 0 )
{
MessageBox . Show ( "You are removing the last known admin, that would break this program.\n\rThe IsAdmin selection has changed to YES, please re-check the form entry then resubmit." , "Great Home Childcare" , MessageBoxButtons . OK , MessageBoxIcon . None ) ;
isAdminComboBox . SelectedItem = IsAdmin . Yes ;
return ;
}
2021-01-27 17:58:27 -05:00
SqliteDataAccess . UpdateGuardian ( guardian ) ;
}
2021-01-27 17:09:40 -05:00
Close ( ) ;
}
// Basic input validation on a string given a textbox control
// ensures only values a-z, with length two or greater.
private void String_TextBox_Validating ( object sender , CancelEventArgs e )
{
TextBox tb = ( TextBox ) sender ;
if ( ! Regex . IsMatch ( tb . Text , "[A-Za-z]{2,}" ) )
errorProvider1 . SetError ( tb , "Enter a value a-z only of length two or longer." ) ;
else
errorProvider1 . SetError ( tb , "" ) ;
}
/ * Does not really check to see if it is a valid phone number
* since the phone companies introduce new area codes all the damn time .
* Only checks to see the most likely case that the user of the program
* has left the phone number value as the default minimum value .
* /
private void phoneNumberNumericUpDown_Validating ( object sender , CancelEventArgs e )
{
if ( phoneNumberNumericUpDown . Value = = phoneNumberNumericUpDown . Minimum
| | phoneNumberNumericUpDown . Value = = phoneNumberNumericUpDown . Maximum )
{ errorProvider1 . SetError ( phoneNumberNumericUpDown , "Type in a valid phone number" ) ; }
else
{ errorProvider1 . SetError ( phoneNumberNumericUpDown , "" ) ; }
}
//Validates any given combobox to ensure an item is selected.
private void isAdminComboBox_Validating ( object sender , CancelEventArgs e )
{
ComboBox cb = ( ComboBox ) sender ;
if ( cb . SelectedIndex < 0 )
{ errorProvider1 . SetError ( cb , "Select an item." ) ; }
else
{ errorProvider1 . SetError ( cb , "" ) ; }
}
//validate a 4-digit pin number was entered.
private void tbPinNumber_Validating ( object sender , CancelEventArgs e )
{
if ( tbPinNumber . TextLength ! = 4 )
{ errorProvider1 . SetError ( tbPinNumber , "Please enter a 4-digit PIN." ) ; }
else
{ errorProvider1 . SetError ( tbPinNumber , "" ) ; }
}
/ * Checks to see if provided email address is valid
* by matching against an email address regex i stole from the interweb .
* /
private void emailAddressTextBox_Validating ( object sender , CancelEventArgs e )
{
//email address regex
//^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,5}$
if ( ! Regex . IsMatch ( emailAddressTextBox . Text , @"^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,5}$" ) )
errorProvider1 . SetError ( emailAddressTextBox , "Enter a valid email address: user@domain.com" ) ;
else
errorProvider1 . SetError ( emailAddressTextBox , "" ) ;
}
private void btnNumButton_Click ( object sender , EventArgs e )
{
//Don't allow a PIN length longer than 4 digits.
if ( strPin . Length > = 4 )
return ;
//to the passed in sender source and cast it to a Button
Button button = ( Button ) sender ;
strPin + = button . Text ;
tbPinNumber . Text + = button . Text ;
}
//Prevents typing in the pin number box.
private void tbPinNumber_KeyPress ( object sender , KeyPressEventArgs e )
{
//Don't allow typing in the control.
e . Handled = true ;
}
/ * Clears the pin entry completely ,
* resetting the hidden variable strPin ,
* and clearing the text box
* /
private void btnCE_Click ( object sender , EventArgs e )
{
strPin = String . Empty ;
tbPinNumber . Text = String . Empty ;
}
// Deletes the last number entered into the pinpad.
private void btnBack_Click ( object sender , EventArgs e )
{
//If there is nothing in the display, do not attempt
//to remove any digits, or the program will crash.
if ( strPin . Length = = 0 )
return ;
//Assign the text in the display using a substring
//of whatever the text is, subtracting the length by 1.
//This effectively 'strips' the last digit from the display string.
tbPinNumber . Text = tbPinNumber . Text . Substring ( 0 , tbPinNumber . Text . Length - 1 ) ;
strPin = strPin . Substring ( 0 , strPin . Length - 1 ) ;
2021-01-26 00:20:13 -05:00
}
2021-01-23 23:36:52 -05:00
}
}