From 746f8c40395796b61d2eff20b82fafd87ee29c4a Mon Sep 17 00:00:00 2001 From: Frozd <59323943+frozdbyte@users.noreply.github.com> Date: Fri, 28 Nov 2025 12:09:07 +0100 Subject: [PATCH] fix: Update instead of re-fill --- CarManagerV2/Car.cs | 7 +++- CarManagerV2/CarCard.cs | 13 +++++++ CarManagerV2/CarDetailsForm.cs | 4 ++- CarManagerV2/MainForm.cs | 65 ++++++++++++++++++++++++++++++++-- 4 files changed, 84 insertions(+), 5 deletions(-) diff --git a/CarManagerV2/Car.cs b/CarManagerV2/Car.cs index e79fcbf..4764c60 100644 --- a/CarManagerV2/Car.cs +++ b/CarManagerV2/Car.cs @@ -54,7 +54,12 @@ namespace CarManagerV2 public bool IsChanged(Car other) { - return make != other.make || model != other.model || year != other.year || color != other.color || mileage != other.mileage || price != other.price; + return make != other.make || model != other.model || year != other.year || color != other.color || mileage != other.mileage || price != other.price || other.color != color; + } + + public Car Clone() + { + return new Car(id, make, model, year, color, mileage, price); } } } diff --git a/CarManagerV2/CarCard.cs b/CarManagerV2/CarCard.cs index 0b83486..e6b443d 100644 --- a/CarManagerV2/CarCard.cs +++ b/CarManagerV2/CarCard.cs @@ -12,6 +12,8 @@ namespace CarManagerV2 { public partial class CarCard : UserControl { + public Car Car; + public string CarName { get { return lblCarName.Text; } @@ -58,5 +60,16 @@ namespace CarManagerV2 this.CardClicked(this, EventArgs.Empty); } } + + public void ClearCardClickedHandlers() + { + if (this.CardClicked != null) + { + foreach (Delegate d in this.CardClicked.GetInvocationList()) + { + this.CardClicked -= (EventHandler)d; + } + } + } } } diff --git a/CarManagerV2/CarDetailsForm.cs b/CarManagerV2/CarDetailsForm.cs index d6583a9..6d0671e 100644 --- a/CarManagerV2/CarDetailsForm.cs +++ b/CarManagerV2/CarDetailsForm.cs @@ -67,15 +67,17 @@ namespace CarManagerV2 btnDelete.Enabled = false; var msgbox = new PleaseWait(); msgbox.Show(); - Application.DoEvents(); await Task.Run(() => { StateManager.UpdateCar(car); + Console.WriteLine("Saved car: " + car.Id); }); await Task.Run(() => { ImageManager.GetImage(car); + Console.WriteLine("Updated image for car: " + car.Id); }); + Console.WriteLine("Car saved. " + car.Id); btnSave.Enabled = true; btnDelete.Enabled = true; this.Close(); diff --git a/CarManagerV2/MainForm.cs b/CarManagerV2/MainForm.cs index c1aa543..77cd88f 100644 --- a/CarManagerV2/MainForm.cs +++ b/CarManagerV2/MainForm.cs @@ -13,13 +13,16 @@ namespace CarManagerV2 public partial class MainForm : Form { List cars = new List(); + List lastCars = new List(); public MainForm() { InitializeComponent(); SafeManager.InitializeFile("cars.csv"); List _cars = SafeManager.ReadCars("cars.csv"); + refreshCars(_cars); + } private async void refreshCars(List _cars) @@ -81,29 +84,85 @@ namespace CarManagerV2 // Console.WriteLine($"Added cars: {addedCars.Count}, Removed cars: {removedCars.Count}, Modified cars: {modifiedCars.Count}"); //} - flpCars.Controls.Clear(); + // Get the cars currently in the FlowLayoutPanel to compare with _cars + + + //flpCars.Controls.Clear(); foreach (Car car in _cars) { + // not in list? add it + bool isNew = flpCars.Controls.OfType().All(c => c.Car.Id != car.Id); + bool isUpdated = false; + // existing but changed? update it CarCard card = new CarCard(); + if (!isNew) + { + CarCard existing = flpCars.Controls.OfType().First(c => c.Car.Id == car.Id); + Car existingCar = existing.Car; + if (existing == null) + { + Console.Error.WriteLine($"[L] Error: Existing car card not found for car ID: {car.Id}"); + continue; + } + // compare details + Console.WriteLine($"[L] Checking car: {car.Id} | Car Color: {car.Color} | Ex Color: {existingCar.Color}"); + if (existingCar.IsChanged(car)) + { + + isUpdated = true; + Console.WriteLine($"[L] Updating car: {car.Id}"); + // changes + card = existing; + + } + else + { + // no changes + Console.WriteLine($"[L] No changes for car: {car.Id}"); + continue; + } + } + card.CarName = $"{car.Make} {car.Model}"; card.CarDetails = $"{car.Year}, {car.Mileage} km, ${car.Price}"; + card.Car = car.Clone(); card.CarImage = await Task.Run(() => ImageManager.GetImage(car)); + // clear existing event handlers to prevent multiple subscriptions + card.ClearCardClickedHandlers(); card.CardClicked += (s, e) => { Console.WriteLine($"Card clicked: {car.Id}"); CarDetailsForm detailsForm = new CarDetailsForm(car); detailsForm.FormClosed += async (s2, e2) => { + Console.WriteLine("Car details form closed."); // refresh cars - Application.DoEvents(); Console.WriteLine("Refreshing cars..."); List __cars = await Task.Run(() => SafeManager.ReadCars("cars.csv")); refreshCars(__cars); }; detailsForm.ShowDialog(); }; - flpCars.Controls.Add(card); + if (isNew) + { + flpCars.Controls.Add(card); + } } + + // Remove cards that are no longer in _cars + var carIds = _cars.Select(c => c.Id).ToList(); + var cardsToRemove = flpCars.Controls.OfType().Where(c => !carIds.Contains(c.Car.Id)).ToList(); + foreach (var card in cardsToRemove) + { + flpCars.Controls.Remove(card); + } + flpCars.Invalidate(); + + flpCars.Refresh(); + + lastCars = new List(cars); + + }