using Mysql_example.Database.Schema; using Mysql_example.Util; using System.ComponentModel; using System.Globalization; namespace Mysql_example { public partial class UserEditForm : Form { User user; User user_copy; public delegate void SaveUserDelegate(ref User user); public SaveUserDelegate SaveUserCallback; private DataGridViewCellEventArgs mouseLocation; private bool isEmailValid = true; public UserEditForm(ref User _user) { this.user = _user; this.user_copy = new User(user); InitializeComponent(); BindUserData(); BindAddressData(); this.Text = user.FirstName + " " + user.LastName; } private void BindUserData() { TextBoxFirstName.DataBindings.Clear(); TextBoxFirstName.DataBindings.Add(nameof(TextBoxFirstName.Text), user_copy, nameof(user_copy.FirstName)); TextBoxLastName.DataBindings.Clear(); TextBoxLastName.DataBindings.Add(nameof(TextBoxLastName.Text), user_copy, nameof(user_copy.LastName)); TextBoxEmail.DataBindings.Clear(); TextBoxEmail.DataBindings.Add(nameof(TextBoxEmail.Text), user_copy, nameof(user_copy.Email)); DateTimePickerBirthday.DataBindings.Clear(); DateTimePickerBirthday.DataBindings.Add(nameof(DateTimePickerBirthday.Value), user_copy, nameof(user_copy.Birthday)); } private void BindAddressData() { DataGridViewColumn oldColumn = DataGridViewAddresses.Columns["Country"]; if (oldColumn != null)DataGridViewAddresses.Columns.Remove(oldColumn); DataGridViewAddresses.DataSource = Utility.addressesToBindingList(user_copy.Addresses); (DataGridViewAddresses.DataSource as BindingList
).ListChanged += UserEditForm_ListChanged; DataGridViewAddresses.Columns[nameof(Address.Region)].Visible= false; DataGridViewAddresses.Columns[nameof(Address.RegionCode)].Visible = false; DataGridViewComboBoxColumn countryColumn= new DataGridViewComboBoxColumn(); countryColumn.HeaderText = "Country"; countryColumn.Name= "Country"; countryColumn.DataSource = Address.regionInfos; countryColumn.DisplayMember = nameof(RegionInfo.EnglishName); countryColumn.DataPropertyName = nameof(Address.Region); countryColumn.ValueMember = nameof(RegionInfo.Name); DataGridViewAddresses.Columns.Add(countryColumn); } private void UserEditForm_ListChanged(object? sender, ListChangedEventArgs e) { BindingList
bindingList = sender as BindingList
; if (e.ListChangedType == ListChangedType.ItemAdded && bindingList.Count > user_copy.Addresses.Values.Count) { Address newAddress = bindingList.Last(); user_copy.Addresses[newAddress.Id] = newAddress; } if (e.ListChangedType == ListChangedType.ItemDeleted && bindingList.Count < user_copy.Addresses.Values.Count) { Address oldAddress = user_copy.Addresses.Values.ToList()[e.NewIndex]; user_copy.Addresses.Remove(oldAddress.Id); user_copy.deletedAddreses.Add(oldAddress); if (user_copy.BillingAdress != null && user_copy.BillingAdress.Id == oldAddress.Id) user_copy.BillingAdress = null; if (user_copy.BillingAdress != null && user_copy.ShippingAddress.Id == oldAddress.Id) user_copy.ShippingAddress = null; } } private void DataGridViewAddresses_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { DataGridViewRow dataRow = DataGridViewAddresses.Rows[e.RowIndex]; Address address = dataRow.DataBoundItem as Address; if(address == null) return; string matches = ""; if (user_copy.BillingAdress != null && user_copy.BillingAdress.Id == address.Id) matches += "billing"; if (user_copy.ShippingAddress != null && user_copy.ShippingAddress.Id == address.Id) matches += "shipping"; switch (matches) { case "billing": dataRow.DefaultCellStyle.BackColor = Color.Green; break; case "shipping": dataRow.DefaultCellStyle.BackColor = Color.Yellow; break; case "billingshipping": dataRow.DefaultCellStyle.BackColor = Color.Blue; break; default: dataRow.DefaultCellStyle.BackColor = base.BackColor; break; } } private void CancelButton_Click(object sender, EventArgs e) { this.Close(); } private void RevertButton_Click(object sender, EventArgs e) { DialogResult dialogResult = MessageBox.Show("You will loose all your Changes", "revert Changes", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.No) return; user_copy = new User(user); BindUserData(); BindAddressData(); } private void SaveButton_Click(object sender, EventArgs e) { if (!isEmailValid) { MessageBox.Show("Can't Save Email is Invalid"); return; } SaveUserCallback(ref user_copy); Close(); } // Update Copy of User Callbacks private void DataGridViewAddresses_CellMouseEnter(object sender, DataGridViewCellEventArgs e) { mouseLocation = e; } private void ToolStripMenuItemMakeDefaultBilling_Click(object sender, EventArgs e) { if (DataGridViewAddresses.Rows.Count - 1 == mouseLocation.RowIndex) return; DataGridViewRow row = DataGridViewAddresses.Rows[mouseLocation.RowIndex]; Address address = row.DataBoundItem as Address; user_copy.BillingAdress = address; DataGridViewAddresses.Refresh(); } private void ToolStripMenuItemMakeDefaultShipping_Click(object sender, EventArgs e) { if (DataGridViewAddresses.Rows.Count - 1 == mouseLocation.RowIndex) return; DataGridViewRow row = DataGridViewAddresses.Rows[mouseLocation.RowIndex]; Address address = row.DataBoundItem as Address; user_copy.ShippingAddress = address; DataGridViewAddresses.Refresh(); } private void ToolStripMenuItemDelete_Click(object sender, EventArgs e) { DialogResult dialogResult = MessageBox.Show("Delete Address?", "Address Deletion", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.No) return; if (DataGridViewAddresses.Rows.Count - 1 == mouseLocation.RowIndex) return; DataGridViewRow row = DataGridViewAddresses.Rows[mouseLocation.RowIndex]; Address address = row.DataBoundItem as Address; (DataGridViewAddresses.DataSource as BindingList
).Remove(address); } private void DataGridViewAddresses_CellClick(object sender, DataGridViewCellEventArgs e) { bool validClick = (e.RowIndex != -1 && e.ColumnIndex != -1); if (validClick) DataGridViewAddresses.BeginEdit(true); if (DataGridViewAddresses.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn && validClick) ((ComboBox)DataGridViewAddresses.EditingControl).DroppedDown = true; } private void DataGridViewAddresses_CurrentCellDirtyStateChanged(object sender, EventArgs e) { DataGridViewAddresses.CommitEdit(DataGridViewDataErrorContexts.Commit); } public void TextBoxEmail_Validating(object sender, System.ComponentModel.CancelEventArgs e) { if (Utility.IsValidEmail(TextBoxEmail.Text)) { ErrorProviderUserEdit.SetError(TextBoxEmail, ""); isEmailValid = true; return; } ErrorProviderUserEdit.SetError(TextBoxEmail, "Email is Invalid"); ErrorProviderUserEdit.SetIconPadding(TextBoxEmail, 3); isEmailValid = false; } } }