3 svar
125 visningar
litenprogrammerare 1
Postad: 27 maj 2023 12:34

Windows forms: Fordonsregister. Inget dyker upp vid registrering av fordon.

Hej! 

Jag håller på med en uppgift i Programmering 2 i C# som går ut på att skapa ett fordonsregister i Windows Forms. Jag har skapat en form och byggt upp den enligt bilden nedan. Dock så får jag det inte att fungera vid registrering av fordonet. Ingenting dyker upp i listView när jag trycker på knappen och fyllt i inmatingsfälten. Jag har skapat kolumner i listView så det kanske är något där jag missar? 

Här är en bild på uppgiften.

Nedan så är mina försök till att lösa uppgiften. Om någon ser något knas i koden så säg gärna till, ser inte mina egna fel längre. 

 

Här är RegisterManager.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public class RegisterManager
    {
        private List<Vehicle> vehicleList;
        private ListView listView;

        public RegisterManager(ListView listView)
        {
            vehicleList = new List<Vehicle>();
            this.listView = listView;
        }

        public void AddVehicle(Vehicle vehicle)
        {
            if (!IsRegistrationNumberUnique(vehicle.RegistrationNumber))
            {
                MessageBox.Show("Ett fordon med samma registreringsnummer finns redan.", "Fel", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            vehicleList.Add(vehicle);
            AddVehicleToListView(vehicle);
        }

        private bool IsRegistrationNumberUnique(string registrationNumber)
        {
            foreach (Vehicle vehicle in vehicleList)
            {
                if (vehicle.RegistrationNumber == registrationNumber)
                    return false;
            }
            return true;
        }

        private void AddVehicleToListView(Vehicle vehicle)
        {
            ListViewItem item = new ListViewItem(vehicle.RegistrationNumber);
            item.SubItems.Add(vehicle.Brand);
            item.SubItems.Add(vehicle.Model);
            item.SubItems.Add(vehicle.Type);

            listView.Items.Add(item);
        }
    }
}

 

Här är form1.cs

using System;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private RegisterManager registerManager;

        public Form1()
        {
            InitializeComponent();
            registerManager = new RegisterManager(listViewVehicles);
        }

        private void btnAddVehicle_Click(object sender, EventArgs e)
        {
            string registrationNumber = textBoxRegNr.Text;
            string brand = textBoxBrand.Text;
            string model = textBoxModel.Text;
            string type = comboBoxType.Text;

            Vehicle vehicle;

                switch (type)
            {
                case "Car":
                    vehicle = new Car(registrationNumber, brand, model, type);
                    break;
                case "Bus":
                    vehicle = new Bus(registrationNumber, brand, model, type);
                    break;
                case "Boat":
                    vehicle = new Boat(registrationNumber, brand, model, type);
                    break;
                case "Motorcycle":
                    vehicle = new Motorcycle(registrationNumber, brand, model, type);
                    break;
                default:
                    // Om ingen giltig fordonstyp väljs kan du hantera det här
                    return;
            }

            registerManager.AddVehicle(vehicle);

            // Skapa ett ListViewItem med fordonets data
            ListViewItem item = new ListViewItem(registrationNumber);
            item.SubItems.Add(brand);
            item.SubItems.Add(model);
            item.SubItems.Add(type);

            // Lägg till ListViewItem i listview
            listViewVehicles.Items.Add(item);

            // Återställ textfält
            textBoxRegNr.Text = "";
            textBoxBrand.Text = "";
            textBoxModel.Text = "";
            comboBoxType.Text = "";
        }
    }
}

 

Jag har även skapat en abstrakt basklass som heter Vehicle och underklasser till denne dvs car, motorcycle, bus och så har jag själv lagt till boat också.

 

Vehicle.cs ser ut såhär:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    public abstract class Vehicle
    {
        public string RegistrationNumber { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
        public string Type { get; set; }

        protected Vehicle (string registrationNumber, string brand, string model, string type)
        {
            RegistrationNumber = registrationNumber;
            Brand = brand;
            Model = model;
            Type = type;
        }

        public abstract string GetInfo();
    }
}

 

Ett exempel på underklass (car): 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    public class Car : Vehicle
    {
        public Car(string registrationNumber, string brand, string model, string type)
            : base(registrationNumber, brand, model, type)
        {
        }

        public override string GetInfo()
        {
            return $"{RegistrationNumber} - {Brand} {Model} (Bil)";
        }
    }
}
anders_k Online 234
Postad: 28 maj 2023 18:17

Har du satt property View till Details ?

dvs.

listViewVehicles.View = Details;
anders_k Online 234
Postad: 28 maj 2023 18:25

Sen behöver du inte spara en property "type", du vet vad är för typ genom själva klassen Car, .. osv

Du kan också använda "Tag" för att spara din instans, så slipper du ha samma info på flera ställen.

private void button1_Click(object sender, EventArgs e)
{
  Vehicle? v = null;
  switch (comboBox1.SelectedIndex)
  {
  case -1:
  case 0: 
    v = new Car(tbRegNr.Text, tbBrand.Text, tbModel.Text);
    break;
  case 1:
    v = new Motorcycle(tbRegNr.Text, tbBrand.Text, tbModel.Text);
    break;
  case 2:
    v = new Truck(tbRegNr.Text, tbBrand.Text, tbModel.Text);
    break;
  }

  var listViewItem = new ListViewItem(tbRegNr.Text);
  if (v != null)
  {
    listViewItem.SubItems.Add(v.Brand);
    listViewItem.SubItems.Add(v.Model);
    listViewItem.Tag = (Vehicle)v; <---
    listView.Items.Add(listViewItem);
  }
}
anders_k Online 234
Postad: 28 maj 2023 18:33

Du kan även göra det enklare för dig genom att låta Vehicle ärva från ListViewItem

public class Vehicle : ListViewItem
{
  public Vehicle(string regNr, string brand, string model) : base(regNr)
  {
    RegNr = regNr;
    Brand = brand;
    Model = model;

    SubItems.Add(Brand);
    SubItems.Add(Model);
  }

  public string RegNr { get; set; }
  public string Brand { get; set; }
  public string Model { get; set; }

}

Sen då du skapar din Car skriver du bara

private void button1_Click(object sender, EventArgs e)
{
  Vehicle? v = null;
  switch (comboBox1.SelectedIndex)
  {
    case -1:
    case 0: 
      v = new Car(tbRegNr.Text, tbBrand.Text, tbModel.Text);
      break;
    case 1:
      //v = new Motorcycle(tbRegNr.Text, tbBrand.Text, tbModel.Text);
      break;
    case 2:
      //v = new Truck(tbRegNr.Text, tbBrand.Text, tbModel.Text);
      break;
  }

  if (v != null)
  {
    listView.Items.Add(v);
  }
}
Svara Avbryt
Close