fix: Update instead of re-fill

This commit is contained in:
Frozd
2025-11-28 12:09:07 +01:00
parent cca7c37ffe
commit 746f8c4039
4 changed files with 84 additions and 5 deletions

View File

@@ -54,7 +54,12 @@ namespace CarManagerV2
public bool IsChanged(Car other) 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);
} }
} }
} }

View File

@@ -12,6 +12,8 @@ namespace CarManagerV2
{ {
public partial class CarCard : UserControl public partial class CarCard : UserControl
{ {
public Car Car;
public string CarName public string CarName
{ {
get { return lblCarName.Text; } get { return lblCarName.Text; }
@@ -58,5 +60,16 @@ namespace CarManagerV2
this.CardClicked(this, EventArgs.Empty); this.CardClicked(this, EventArgs.Empty);
} }
} }
public void ClearCardClickedHandlers()
{
if (this.CardClicked != null)
{
foreach (Delegate d in this.CardClicked.GetInvocationList())
{
this.CardClicked -= (EventHandler)d;
}
}
}
} }
} }

View File

@@ -67,15 +67,17 @@ namespace CarManagerV2
btnDelete.Enabled = false; btnDelete.Enabled = false;
var msgbox = new PleaseWait(); var msgbox = new PleaseWait();
msgbox.Show(); msgbox.Show();
Application.DoEvents();
await Task.Run(() => await Task.Run(() =>
{ {
StateManager.UpdateCar(car); StateManager.UpdateCar(car);
Console.WriteLine("Saved car: " + car.Id);
}); });
await Task.Run(() => await Task.Run(() =>
{ {
ImageManager.GetImage(car); ImageManager.GetImage(car);
Console.WriteLine("Updated image for car: " + car.Id);
}); });
Console.WriteLine("Car saved. " + car.Id);
btnSave.Enabled = true; btnSave.Enabled = true;
btnDelete.Enabled = true; btnDelete.Enabled = true;
this.Close(); this.Close();

View File

@@ -13,13 +13,16 @@ namespace CarManagerV2
public partial class MainForm : Form public partial class MainForm : Form
{ {
List<Car> cars = new List<Car>(); List<Car> cars = new List<Car>();
List<Car> lastCars = new List<Car>();
public MainForm() public MainForm()
{ {
InitializeComponent(); InitializeComponent();
SafeManager.InitializeFile("cars.csv"); SafeManager.InitializeFile("cars.csv");
List<Car> _cars = SafeManager.ReadCars("cars.csv"); List<Car> _cars = SafeManager.ReadCars("cars.csv");
refreshCars(_cars); refreshCars(_cars);
} }
private async void refreshCars(List<Car> _cars) private async void refreshCars(List<Car> _cars)
@@ -81,29 +84,85 @@ namespace CarManagerV2
// Console.WriteLine($"Added cars: {addedCars.Count}, Removed cars: {removedCars.Count}, Modified cars: {modifiedCars.Count}"); // 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) foreach (Car car in _cars)
{ {
// not in list? add it
bool isNew = flpCars.Controls.OfType<CarCard>().All(c => c.Car.Id != car.Id);
bool isUpdated = false;
// existing but changed? update it
CarCard card = new CarCard(); CarCard card = new CarCard();
if (!isNew)
{
CarCard existing = flpCars.Controls.OfType<CarCard>().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.CarName = $"{car.Make} {car.Model}";
card.CarDetails = $"{car.Year}, {car.Mileage} km, ${car.Price}"; card.CarDetails = $"{car.Year}, {car.Mileage} km, ${car.Price}";
card.Car = car.Clone();
card.CarImage = await Task.Run(() => ImageManager.GetImage(car)); card.CarImage = await Task.Run(() => ImageManager.GetImage(car));
// clear existing event handlers to prevent multiple subscriptions
card.ClearCardClickedHandlers();
card.CardClicked += (s, e) => card.CardClicked += (s, e) =>
{ {
Console.WriteLine($"Card clicked: {car.Id}"); Console.WriteLine($"Card clicked: {car.Id}");
CarDetailsForm detailsForm = new CarDetailsForm(car); CarDetailsForm detailsForm = new CarDetailsForm(car);
detailsForm.FormClosed += async (s2, e2) => detailsForm.FormClosed += async (s2, e2) =>
{ {
Console.WriteLine("Car details form closed.");
// refresh cars // refresh cars
Application.DoEvents();
Console.WriteLine("Refreshing cars..."); Console.WriteLine("Refreshing cars...");
List<Car> __cars = await Task.Run(() => SafeManager.ReadCars("cars.csv")); List<Car> __cars = await Task.Run(() => SafeManager.ReadCars("cars.csv"));
refreshCars(__cars); refreshCars(__cars);
}; };
detailsForm.ShowDialog(); 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<CarCard>().Where(c => !carIds.Contains(c.Car.Id)).ToList();
foreach (var card in cardsToRemove)
{
flpCars.Controls.Remove(card);
}
flpCars.Invalidate();
flpCars.Refresh();
lastCars = new List<Car>(cars);
} }