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; /* References */ // Using a delegate to trigger method on the customer view form // https://www.coderslexicon.com/passing-data-between-forms-using-delegates-and-events/ namespace QueueSys { public partial class frmEmployeeView : Form { public frmEmployeeView() { InitializeComponent(); } // Our delegate (which "points" at any method which takes an object and EventArgs) // Look familiar? This is the signature of most control events on a form public delegate void SendMessage(object obj, EventArgs e); // Here is the event we trigger to send messages out to listeners public event SendMessage OnSendMessage; /* Execute when program / main form loads. * Pop up the customer view screen to drag onto second monitor * creates our second form, says "attach its MessageReceived function to the event" */ private void frmEmployeeView_Load(object sender, EventArgs e) { frmCustomerView frm = new frmCustomerView(); OnSendMessage += frm.MessageReceived; frm.Show(); RefreshEmployeeView(); } /* Enable options menu. */ private void optionsToolStripMenuItem_Click(object sender, EventArgs e) { frmOptions frm = new frmOptions(); frm.Show(); frm.Activate(); } // Exits the application. private void exitAltF4ToolStripMenuItem_Click(object sender, EventArgs e) => Application.Exit(); private void generateReportToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("To-do: Generate excel report from SQL Database."); } private void btnAdd_Click(object sender, EventArgs e) { SqliteDataAccess sda = new SqliteDataAccess(); ReportView evNewCx = new ReportView(); evNewCx.customer_name = tbCustomerName.Text; evNewCx.num_bags = Int32.Parse(cbNumBags.Text); evNewCx.employee = tbEmployeeName.Text; sda.SaveCustomer(evNewCx); //Invoke the delegate to update customer view. OnSendMessage?.Invoke(this, e); tbCustomerName.Text = ""; cbNumBags.Text = ""; tbEmployeeName.Text = ""; MessageBox.Show("Customer has been added!", "Queue System", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void RefreshEmployeeView() { // Build the row. SqliteDataAccess sdaEvView = new SqliteDataAccess(); List evList = new List(); evList = sdaEvView.LoadEmployeeView(); foreach (EmployeeView item in evList) { string[] row = new string[] { item.id.ToString(), item.customer_name }; dgvEmployeeView.Rows.Add(row); } DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn(); cmb.HeaderText = "Status"; cmb.MaxDropDownItems = 3; //Allows for dynamic adding/removing status items per //the status lookup table in the sqlite db. List s = new List(); s = sdaEvView.LoadStatusStrings(); foreach (StatusModel item in s) { cmb.Items.Add(item.status); } dgvEmployeeView.Columns.Add(cmb); //Change the status of the combobox based on the query from the db. List cxStatus = new List(); //Select the id column from the current row. foreach(DataGridViewRow row in dgvEmployeeView.Rows) { cxStatus = sdaEvView.GetCxStatus(Int32.Parse(dgvEmployeeView.CurrentRow.Cells[0].Value.ToString())); row.Cells[2].Value = cxStatus[0].status; } // Add the delete button. DataGridViewButtonColumn btn = new DataGridViewButtonColumn(); btn.HeaderText = "Delete"; btn.Text = "Delete"; btn.Name = "btn"; btn.UseColumnTextForButtonValue = true; dgvEmployeeView.Columns.Add(btn); } private void dgvEmployeeView_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == 3) { MessageBox.Show("Row"+e.RowIndex); } } } }