簡體   English   中英

顯示有關在文本框中的列表框中選擇的對象的信息

[英]display information about an object selected in a listbox in textboxes

我想顯示有關在旁邊的文本框中列表框中選擇的任何航班的信息。 我的問題是我無法讓我的curFlight變量正常工作給我InvalidCastException是未處理的錯誤並且說當向某個數字轉換時,值必須是小於無窮大的數字。

繼承我的表格代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Reservations
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Flight curFlight;

        Flight flight1 = new Flight("Cessna Citation X", "10:00AM", "Denver", 6, 2);
        Flight flight2 = new Flight("Piper Mirage", "10:00PM", "Kansas City", 3, 2);

        private void Form1_Load(object sender, EventArgs e)
        {
            MakeReservations();
            DisplayFlights();

        }

        private void lstFlights_SelectedIndexChanged(object sender, EventArgs e)
        {
            curFlight = (Flight)lstFlights.SelectedItem;
            txtDepart.Text = curFlight.DepartureTime;
            txtDestination.Text = curFlight.Destination;
        }

        private void MakeReservations()
        {
            flight1.MakeReservation("Dill", 12);
            flight1.MakeReservation("Deenda", 3);
            flight1.MakeReservation("Schmanda", 11);
            flight2.MakeReservation("Dill", 4);
            flight2.MakeReservation("Deenda", 2);
        }

        private void DisplayFlights()
        {
            lstFlights.Items.Clear();
            lstFlights.Items.Add(flight1.Plane);
            lstFlights.Items.Add(flight2.Plane);
        }

        private void btnMakeReservation_Click(object sender, EventArgs e)
        {
            string name;
            int seatNum;

            name = txtCustomerName.Text;
            seatNum = Convert.ToInt16(txtSeatNum.Text);

            curFlight.MakeReservation(name, seatNum);
        }
    }
}

以下是課程代碼

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

namespace Reservations
{
    class Flight
    {
        private string mPlane;
        private string mDepartureTime;
        private string mDestination;
        private int mRows;
        private int mSeats;
        private string[] mSeatChart;

        public Flight()
        {
        }

        public Flight(string planeType, string departureTime, string destination, int numRows, int numSeatsPerRow)
        {
            this.Plane = planeType;
            this.DepartureTime = departureTime;
            this.Destination = destination;
            this.Rows = numRows;
            this.Seats = numSeatsPerRow;

            // create the seat chart array
            mSeatChart = new string[Rows * Seats];

            for (int seat = 0; seat <= mSeatChart.GetUpperBound(0); seat++)
            {
                mSeatChart[seat] = "Open";
            }
        }

        public string Plane
        {
            get { return mPlane; }
            set { mPlane = value; }
        }

        public string DepartureTime
        {
            get { return mDepartureTime; }
            set { mDepartureTime = value; }
        }

        public string Destination
        {
            get { return mDestination; }
            set { mDestination = value; }
        }

        public int Rows
        {
            get { return mRows; }
            set { mRows = value; }
        }

        public int Seats
        {
            get { return mSeats; }
            set { mSeats = value; }
        }

        public string[] SeatChart
        {
            get { return mSeatChart; }
            set { mSeatChart = value; }
        }


        public void MakeReservation(string name, int seat)
        {
            if (seat <= (Rows * Seats) && mSeatChart[seat - 1] == "Open")
            {
                mSeatChart[seat - 1] = name;
            }
            else
            {
                //let calling program know it didnt work.

            }
        }

        public bool IsFull()
        {
            return false;
        }
    }
}

您收到錯誤的原因是您將字符串分配給列表框,然后嘗試將該字符串強制轉換為Flight對象

lstFlights.Items.Add(flight1.Plane);   // Just say it is named "Plane 1"
lstFlights.Items.Add(flight2.Plane);   // Just say it is named "Plane 2"


curFlight = (Flight)lstFlights.SelectedItem; // Now you are trying to convert "Plane 2" into a flight object which is incorrect

試試這個

添加全球航班類型列表

List<Flight> flightList = new List<Flight>();

Flight flight1 = new Flight("Cessna Citation X", "10:00AM", "Denver", 6, 2);
Flight flight2 = new Flight("Piper Mirage", "10:00PM", "Kansas City", 3, 2);

在您的表單加載添加SetupFlights

private void Form1_Load(object sender, EventArgs e)
{
        MakeReservations();
        DisplayFlights();
        SetupFlights();  // added this line
}

 private void SetupFlights()
 {
        flightList.Add(flight1);
        flightList.Add(flight2);
 }

並且您選擇的Index Changed應該是這樣的

private void lstFlights_SelectedIndexChanged(object sender, EventArgs e)
{
        curFlight = flightList.FirstOrDefault(x => x.Plane == lstFlights.SelectedItem.ToString()); // Changed this line
        txtDepart.Text = curFlight.DepartureTime;
        txtDestination.Text = curFlight.Destination;
}

雖然MVCKarl的答案更為一般,但我會展示一種更簡單的方法,這可能適用於簡單的情況。

你可以簡單地覆蓋Flight類的ToString

class Flight
{
    //your code

    public override string ToString()
    {
        //or anything you want to display
        return this.Plane;
    }        
}

然后編輯DisplayFlights方法以將航班添加到列表中:

private void DisplayFlights()
{
    lstFlights.Items.Clear();
    lstFlights.Items.Add(flight1);
    lstFlights.Items.Add(flight2);
}

在此之后,你的lstFlights_SelectedIndexChanged將按預期開始工作:

private void lstFlights_SelectedIndexChanged(object sender, EventArgs e)
{
    curFlight = (Flight)lstFlights.SelectedItem;
    textBox1.Text = curFlight.DepartureTime;
    textBox2.Text = curFlight.Destination;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM