Как исправить System.InvalidCastException: ‘Указанное приведение недопустимо.’

#c# #listbox #unhandled-exception #sortedlist

#c# #список #необработанное исключение #сортированный список

Вопрос:

У меня есть программа системы бронирования, и в одной форме перечислены уже сделанные бронирования в зависимости от выбранной даты. Все время бронирований, сделанных на выбранную дату, должно было отображаться в списке. Выбранный элемент в окне списка затем заполнит текстовые поля ниже всеми данными бронирования.

Однако я получаю эту ошибку:

Система.InvalidCastException: ‘Указанное приведение недопустимо.’

Это класс bookingClass:

     public DateTime bookingDate
    {
        get
        {
            return myDate;
        }

        set
        {
            myDate = value;
        }
    }

    public string bookingTime
    {
        get
        {
            return myTime;
        }
        set
        {
            myTime = value;
        }
    }


    public int bookingID
    {
        get
        {
            return myID;
        }
        set
        {
            myID = value;
        }
    }


    public int customerID
    {
        get
        {
            return myCust;
        }
        set
        {
            myCust = value;
        }
    }


    public string bookingTicket
    {
        get
        {
            return myTicket;
        }
        set
        {
            myTicket = value;
        }
    }

    public int bookingQuantity
    {
        get
        {
            return myNum;
        }
        set
        {
            myNum = value;
        }
    }

    public decimal bookingTotal
    {
        get
        {
            return myTotal;
        }
        set
        {
            myTotal = value;
        }
    }


    //A SortedList of booking times is returned for a given Date
    public SortedList GetBookingsByDate(DateTime bookingDate)
    {
        newCon = new System.Data.SqlClient.SqlConnection();

        String firstConStr = "Data Source=.\SQLEXPRESS;AttachDbFilename=";
        String pathToDB = "F:\Level 5\Object Oriented Programs\Programs\assignmentPractice\assignmentPractice\assignmentDB.mdf;";
        String lastConStr = "Integrated Security=True;Connect Timeout=30;User Instance=True";

        newCon.ConnectionString = firstConStr   pathToDB   lastConStr;

        newCon.Open();

        SqlCommand cmBookList = new SqlCommand();
        cmBookList.Connection = newCon;
        cmBookList.CommandType = CommandType.Text;
        cmBookList.CommandText = "Select bookingID, bookingTime from Booking where bookingDate = '"   bookingDate.ToLongDateString()   "'";
        SqlDataReader drBookList = cmBookList.ExecuteReader();

        //This is a sorted list of key/value pairs
        SortedList BookList = new SortedList();

        //drBookList[0] is the key (Booking ID) and drBookList[1] is the value (Booking Time)
        while (drBookList.Read())
        {
            BookList.Add(drBookList[0], drBookList[1]);

        }
        drBookList.Close();
        newCon.Close();
        return BookList;
    }


}
  

Это форма:

     public bookingSearch()
    {
        InitializeComponent();
    }

    private SortedList BookList;
    private bookingClass objBooking;

    private void btnList_Click(object sender, EventArgs e)
    {
        lstBook.Items.Clear();

        bookingClass objBooking = new bookingClass();

        BookList = objBooking.GetBookingsByDate(DateTime.Parse(dtpDate.Text));

        //Populate the ListBox with the Booking times
        if (BookList.Count == 0)
        {
            lstBook.Items.Add("No Records");
            return;
        }
        foreach (DictionaryEntry book in BookList)
        {
            lstBook.Items.Add(book.Value);
        }
        lstBook.SelectedIndex = 0;


    }

    private void lstBook_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (BookList.Count > 0)     //Don't process if 'No Records'
        {
            //Get the Booking details for a particular selected time in the list
            //The SelectedIndex is used to read the Key value from the
            //SortedList which holds the bookingID
            objBooking.GetBookingsByDate((DateTime)BookList.GetKey(lstBook.SelectedIndex));

            txtID.Text = objBooking.bookingID.ToString();
            txtCust.Text = objBooking.customerID.ToString();
            txtTime.Text = objBooking.bookingTime;
            txtTicket.Text = objBooking.bookingTicket;
            txtNum.Text = objBooking.bookingQuantity.ToString();
            txtTotal.Text = objBooking.bookingTotal.ToString();
        }
    }

}
  

Он выделяет эту строку, когда я получаю сообщение об ошибке:

 objBooking.GetBookingsByDate((DateTime)BookList.GetKey(lstBook.SelectedIndex))
  

Любая помощь очень ценится.

Комментарии:

1. Похоже, ключ не является датой любого рода. So BookList.GetKey() не вернет ничего, что может быть приведено к a DateTime . Может быть, вы забыли один шаг, фактически получая бронирование и извлекая оттуда время?

2. На основе вашего sql ваш ключ — это идентификатор бронирования, а значение — дата. Я думаю, вы хотите использовать GetByIndex() вместо GetKey() .

3. Ключевое значение — это идентификатор бронирования, так что это int . Я следил за руководством моего учителя о том, как его создать, но в ее примере это включает получение идентификатора категории ( int ) для перечисления группы продуктов, тогда как в моем используется дата бронирования ( DateTime ).

4. Кроме того, почему вы используете отсортированный список, чтобы затем добавлять элементы в список? Почему бы вам просто не связать коллекцию книг? Вы полагаетесь на две несвязанные коллекции, которые будут синхронизированы с порядком их идентификаторов, и я полагаю, что они будут такими, но мне это кажется неудобным.

5. Правильно… GetKey получает ключ , который является int . Вам нужно значение , которое является датой, поэтому используйте метод, который дает вам значение, которое является GetByIndex .