From 222a37c0deef24fa65dc1b396a992f7051004126 Mon Sep 17 00:00:00 2001 From: "c0d3.m0nk3y" Date: Tue, 5 May 2026 14:55:25 -0400 Subject: [PATCH] Continued development --- Forms/ClientForm.Designer.cs | 125 ++++++++++++++++++++++++++++------- Forms/ClientForm.cs | 42 +++++++++--- Forms/MainForm.cs | 11 ++- Models/Client.cs | 2 +- Models/Project.cs | 2 +- Models/TimeEntry.cs | 2 +- 6 files changed, 146 insertions(+), 38 deletions(-) diff --git a/Forms/ClientForm.Designer.cs b/Forms/ClientForm.Designer.cs index f53af72..d5821cb 100644 --- a/Forms/ClientForm.Designer.cs +++ b/Forms/ClientForm.Designer.cs @@ -40,9 +40,14 @@ textBoxName = new TextBox(); textBoxCompany = new TextBox(); textBoxEmail = new TextBox(); - textBoxPhone = new TextBox(); - richTextBoxAddress = new RichTextBox(); comboBoxIsActive = new ComboBox(); + maskedTextBox_Phone = new MaskedTextBox(); + tableLayoutPanel4 = new TableLayoutPanel(); + tableLayoutPanel5 = new TableLayoutPanel(); + textBoxAddressCity = new TextBox(); + comboBoxAddressState = new ComboBox(); + maskedTextBoxAddressZipcode = new MaskedTextBox(); + textBoxAddressStreet = new TextBox(); groupBoxNotes = new GroupBox(); richTextBoxNotes = new RichTextBox(); tableLayoutPanel3 = new TableLayoutPanel(); @@ -52,6 +57,8 @@ groupBoxNewClient.SuspendLayout(); tableLayoutPanel1.SuspendLayout(); tableLayoutPanel2.SuspendLayout(); + tableLayoutPanel4.SuspendLayout(); + tableLayoutPanel5.SuspendLayout(); groupBoxNotes.SuspendLayout(); tableLayoutPanel3.SuspendLayout(); SuspendLayout(); @@ -98,9 +105,9 @@ tableLayoutPanel2.Controls.Add(textBoxName, 1, 0); tableLayoutPanel2.Controls.Add(textBoxCompany, 1, 1); tableLayoutPanel2.Controls.Add(textBoxEmail, 1, 2); - tableLayoutPanel2.Controls.Add(textBoxPhone, 1, 3); - tableLayoutPanel2.Controls.Add(richTextBoxAddress, 1, 4); tableLayoutPanel2.Controls.Add(comboBoxIsActive, 1, 5); + tableLayoutPanel2.Controls.Add(maskedTextBox_Phone, 1, 3); + tableLayoutPanel2.Controls.Add(tableLayoutPanel4, 1, 4); tableLayoutPanel2.Dock = DockStyle.Fill; tableLayoutPanel2.Location = new Point(3, 3); tableLayoutPanel2.Name = "tableLayoutPanel2"; @@ -179,8 +186,10 @@ textBoxName.Dock = DockStyle.Fill; textBoxName.Location = new Point(153, 3); textBoxName.Name = "textBoxName"; + textBoxName.PlaceholderText = "Nancy Thompson"; textBoxName.Size = new Size(960, 39); textBoxName.TabIndex = 6; + textBoxName.Validating += textBoxName_Validating; // // textBoxCompany // @@ -198,31 +207,92 @@ textBoxEmail.Size = new Size(960, 39); textBoxEmail.TabIndex = 8; // - // textBoxPhone - // - textBoxPhone.Dock = DockStyle.Fill; - textBoxPhone.Location = new Point(153, 153); - textBoxPhone.Name = "textBoxPhone"; - textBoxPhone.Size = new Size(960, 39); - textBoxPhone.TabIndex = 9; - // - // richTextBoxAddress - // - richTextBoxAddress.Dock = DockStyle.Fill; - richTextBoxAddress.Location = new Point(153, 203); - richTextBoxAddress.Name = "richTextBoxAddress"; - richTextBoxAddress.Size = new Size(960, 94); - richTextBoxAddress.TabIndex = 10; - richTextBoxAddress.Text = ""; - // // comboBoxIsActive // comboBoxIsActive.FormattingEnabled = true; + comboBoxIsActive.Items.AddRange(new object[] { "True", "False" }); comboBoxIsActive.Location = new Point(153, 303); comboBoxIsActive.Name = "comboBoxIsActive"; comboBoxIsActive.Size = new Size(147, 40); comboBoxIsActive.TabIndex = 11; // + // maskedTextBox_Phone + // + maskedTextBox_Phone.Dock = DockStyle.Fill; + maskedTextBox_Phone.Location = new Point(153, 153); + maskedTextBox_Phone.Mask = "(999) 000-0000"; + maskedTextBox_Phone.Name = "maskedTextBox_Phone"; + maskedTextBox_Phone.Size = new Size(960, 39); + maskedTextBox_Phone.TabIndex = 12; + // + // tableLayoutPanel4 + // + tableLayoutPanel4.ColumnCount = 1; + tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); + tableLayoutPanel4.Controls.Add(tableLayoutPanel5, 0, 1); + tableLayoutPanel4.Controls.Add(textBoxAddressStreet, 0, 0); + tableLayoutPanel4.Dock = DockStyle.Fill; + tableLayoutPanel4.Location = new Point(153, 203); + tableLayoutPanel4.Name = "tableLayoutPanel4"; + tableLayoutPanel4.RowCount = 2; + tableLayoutPanel4.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + tableLayoutPanel4.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + tableLayoutPanel4.Size = new Size(960, 94); + tableLayoutPanel4.TabIndex = 13; + // + // tableLayoutPanel5 + // + tableLayoutPanel5.ColumnCount = 3; + tableLayoutPanel5.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 70F)); + tableLayoutPanel5.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F)); + tableLayoutPanel5.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F)); + tableLayoutPanel5.Controls.Add(textBoxAddressCity, 0, 0); + tableLayoutPanel5.Controls.Add(comboBoxAddressState, 1, 0); + tableLayoutPanel5.Controls.Add(maskedTextBoxAddressZipcode, 2, 0); + tableLayoutPanel5.Dock = DockStyle.Fill; + tableLayoutPanel5.Location = new Point(3, 50); + tableLayoutPanel5.Name = "tableLayoutPanel5"; + tableLayoutPanel5.RowCount = 1; + tableLayoutPanel5.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); + tableLayoutPanel5.Size = new Size(954, 41); + tableLayoutPanel5.TabIndex = 0; + // + // textBoxAddressCity + // + textBoxAddressCity.Dock = DockStyle.Fill; + textBoxAddressCity.Location = new Point(3, 3); + textBoxAddressCity.Name = "textBoxAddressCity"; + textBoxAddressCity.PlaceholderText = "Springwood"; + textBoxAddressCity.Size = new Size(661, 39); + textBoxAddressCity.TabIndex = 0; + // + // comboBoxAddressState + // + comboBoxAddressState.Dock = DockStyle.Fill; + comboBoxAddressState.FormattingEnabled = true; + comboBoxAddressState.Location = new Point(670, 3); + comboBoxAddressState.Name = "comboBoxAddressState"; + comboBoxAddressState.Size = new Size(137, 40); + comboBoxAddressState.TabIndex = 1; + // + // maskedTextBoxAddressZipcode + // + maskedTextBoxAddressZipcode.Dock = DockStyle.Fill; + maskedTextBoxAddressZipcode.Location = new Point(813, 3); + maskedTextBoxAddressZipcode.Mask = "00000"; + maskedTextBoxAddressZipcode.Name = "maskedTextBoxAddressZipcode"; + maskedTextBoxAddressZipcode.Size = new Size(138, 39); + maskedTextBoxAddressZipcode.TabIndex = 2; + // + // textBoxAddressStreet + // + textBoxAddressStreet.Dock = DockStyle.Fill; + textBoxAddressStreet.Location = new Point(3, 3); + textBoxAddressStreet.Name = "textBoxAddressStreet"; + textBoxAddressStreet.PlaceholderText = "1428 Elm Street"; + textBoxAddressStreet.Size = new Size(954, 39); + textBoxAddressStreet.TabIndex = 1; + // // groupBoxNotes // groupBoxNotes.Controls.Add(richTextBoxNotes); @@ -304,6 +374,10 @@ tableLayoutPanel1.ResumeLayout(false); tableLayoutPanel2.ResumeLayout(false); tableLayoutPanel2.PerformLayout(); + tableLayoutPanel4.ResumeLayout(false); + tableLayoutPanel4.PerformLayout(); + tableLayoutPanel5.ResumeLayout(false); + tableLayoutPanel5.PerformLayout(); groupBoxNotes.ResumeLayout(false); tableLayoutPanel3.ResumeLayout(false); tableLayoutPanel3.PerformLayout(); @@ -325,13 +399,18 @@ private TextBox textBoxName; private TextBox textBoxCompany; private TextBox textBoxEmail; - private TextBox textBoxPhone; - private RichTextBox richTextBoxAddress; private ComboBox comboBoxIsActive; private RichTextBox richTextBoxNotes; private TableLayoutPanel tableLayoutPanel3; private Button buttonOkay; private Button buttonCancel; private Label labelCreatedUpdatedDT; + private MaskedTextBox maskedTextBox_Phone; + private TableLayoutPanel tableLayoutPanel4; + private TableLayoutPanel tableLayoutPanel5; + private TextBox textBoxAddressCity; + private ComboBox comboBoxAddressState; + private MaskedTextBox maskedTextBoxAddressZipcode; + private TextBox textBoxAddressStreet; } } \ No newline at end of file diff --git a/Forms/ClientForm.cs b/Forms/ClientForm.cs index e62e556..812f16c 100644 --- a/Forms/ClientForm.cs +++ b/Forms/ClientForm.cs @@ -1,20 +1,42 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; +using System.Reflection.Metadata.Ecma335; +using trakker.Models; namespace trakker.Forms { public partial class ClientForm : Form { - public ClientForm() + private readonly Client _client; + private BindingSource bindingSource = new BindingSource(); + private ErrorProvider errorProvider = new ErrorProvider(); + + public ClientForm(Client client) { + _client = client; InitializeComponent(); + + bindingSource.DataSource = _client; + textBoxName.DataBindings.Add("Text", bindingSource, "Name", true); + textBoxCompany.DataBindings.Add("Text", bindingSource, "Company", true); + textBoxEmail.DataBindings.Add("Text", bindingSource, "Email", true); + maskedTextBox_Phone.DataBindings.Add("Text", bindingSource, "Phone", true); + //richTextBoxAddress.DataBindings.Add("Text", bindingSource, "Address", true); + comboBoxIsActive.DataBindings.Add("Text", bindingSource, "IsActive", true); + richTextBoxNotes.DataBindings.Add("Text", bindingSource, "Notes", true); + + } + public Client Client { get => _client; private set { } } + + private void textBoxName_Validating(object sender, System.ComponentModel.CancelEventArgs e) + { + if (string.IsNullOrWhiteSpace(textBoxName.Text)) + { + errorProvider.SetError(textBoxName, "Name is required."); + e.Cancel = true; + } + else + { + errorProvider.SetError(textBoxName, ""); + } } } } diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index 048cd20..b538478 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -1,9 +1,11 @@ using trakker.Forms; +using trakker.Models; namespace trakker { public partial class MainForm : Form { + /// /// Initializes a new instance of the class. /// Sets up the form's controls and event handlers by calling @@ -11,6 +13,7 @@ namespace trakker /// public MainForm() { + InitializeComponent(); } @@ -27,8 +30,12 @@ namespace trakker private void button1_Click(object sender, EventArgs e) { - var dialog = new ClientForm(); - dialog.ShowDialog(); + Client client = new Client(); + client.ClientId = Guid.NewGuid().ToString(); + var dialog = new ClientForm(client); + dialog.ShowDialog(this); + client = dialog.Client; + MessageBox.Show($"Client Name: {client.Name}\nCompany: {client.Company}\nEmail: {client.Email}\nPhone: {client.Phone}\nAddress: {client.Address}\nIs Active: {client.IsActive}\nNotes: {client.Notes}"); } } } diff --git a/Models/Client.cs b/Models/Client.cs index a221a40..747275d 100644 --- a/Models/Client.cs +++ b/Models/Client.cs @@ -1,7 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; -namespace YourProject.Models +namespace trakker.Models { public class Client { diff --git a/Models/Project.cs b/Models/Project.cs index cc4f92e..4a308cf 100644 --- a/Models/Project.cs +++ b/Models/Project.cs @@ -1,7 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; -namespace YourProject.Models +namespace trakker.Models { public class Project { diff --git a/Models/TimeEntry.cs b/Models/TimeEntry.cs index 31ca3e1..3f3ff37 100644 --- a/Models/TimeEntry.cs +++ b/Models/TimeEntry.cs @@ -1,7 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; -namespace YourProject.Models +namespace trakker.Models { public class TimeEntry {