Array
(
[dirname] => .
[basename] => frmProductMaintenance.cs
[extension] => cs
[filename] => frmProductMaintenance
)
1. file=./frmProductMaintenance.cs
2. file=.//frmProductMaintenance.cs
3. file=frmProductMaintenance.cs
using ProductMaintenance.Models.DataLayer;
namespace ProductMaintenance;
public partial class frmProductMaintenance : Form
{
public frmProductMaintenance()
{
InitializeComponent();
}
MMABooksDataAccess data = new();
Product selectedProduct = null!;
private void frmProductMaintenance_Load(object sender, EventArgs e)
{
DisplayProducts();
}
private void DisplayProducts()
{
dgvProducts.Columns.Clear();
dgvProducts.DataSource = data.GetAllProducts();
// add column for modify button
DataGridViewButtonColumn modifyColumn = new()
{
UseColumnTextForButtonValue = true,
HeaderText = "",
Text = "Modify"
};
dgvProducts.Columns.Add(modifyColumn);
// add column for delete button
DataGridViewButtonColumn deleteColumn = new()
{
UseColumnTextForButtonValue = true,
HeaderText = "",
Text = "Delete"
};
dgvProducts.Columns.Add(deleteColumn);
// format the column header
dgvProducts.EnableHeadersVisualStyles = false;
dgvProducts.ColumnHeadersDefaultCellStyle.Font = new Font("Arial", 9, FontStyle.Bold);
dgvProducts.ColumnHeadersDefaultCellStyle.BackColor = Color.Goldenrod;
dgvProducts.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;
// format the odd numbered rows
dgvProducts.AlternatingRowsDefaultCellStyle.BackColor = Color.PaleGoldenrod;
// format the first column
dgvProducts.Columns[0].HeaderText = "Product Code";
dgvProducts.Columns[0].Width = 110;
// format the second column
dgvProducts.Columns[1].Width = 220;
// format the third column
dgvProducts.Columns[2].HeaderText = "Unit Price";
dgvProducts.Columns[2].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvProducts.Columns[2].Width = 90;
dgvProducts.Columns[2].DefaultCellStyle.Format = "c";
dgvProducts.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}
private void dgvProducts_CellClick(object sender, DataGridViewCellEventArgs e)
{
// index values for Modify and Delete button columns
const int ModifyIndex = 3;
const int DeleteIndex = 4;
if (e.RowIndex > -1) // make sure row header wasn't clicked
{
if (e.ColumnIndex == ModifyIndex || e.ColumnIndex == DeleteIndex)
{
string productCode = dgvProducts.Rows[e.RowIndex].Cells[0].Value?.ToString()?.Trim() ?? "";
selectedProduct = data.FindProduct(productCode)!;
}
if (selectedProduct != null)
{
if (e.ColumnIndex == ModifyIndex)
{
ModifyProduct();
}
else if (e.ColumnIndex == DeleteIndex)
{
DeleteProduct();
}
}
}
}
private void ModifyProduct()
{
frmAddModify addModifyForm = new()
{
Product = selectedProduct,
};
DialogResult result = addModifyForm.ShowDialog();
if (result == DialogResult.OK)
{
try
{
selectedProduct = addModifyForm.Product;
data.UpdateProduct(selectedProduct);
DisplayProducts();
}
catch (DataAccessException ex)
{
HandleDataAccessError(ex);
}
}
}
private void DeleteProduct()
{
DialogResult result =
MessageBox.Show($"Delete {selectedProduct.ProductCode.Trim()}?",
"Confirm Delete", MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
try
{
data.RemoveProduct(selectedProduct);
DisplayProducts();
}
catch (DataAccessException ex)
{
HandleDataAccessError(ex);
}
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
frmAddModify addModifyForm = new();
DialogResult result = addModifyForm.ShowDialog();
if (result == DialogResult.OK)
{
try
{
selectedProduct = addModifyForm.Product;
data.AddProduct(selectedProduct);
DisplayProducts();
}
catch (DataAccessException ex)
{
HandleDataAccessError(ex);
}
}
}
private void HandleDataAccessError(DataAccessException ex)
{
// if concurrency conflict, re-display products
if (ex.IsConcurrencyError)
{
DisplayProducts();
}
// display error message in dialog with error type as title
MessageBox.Show(ex.Message, ex.ErrorType);
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
}