Как разрешить массиву принимать только уникальные индексы списков и генерировать исключение, если выбранный элемент совпадает с любым предыдущим выбором (c #)? - PullRequest
0 голосов
/ 07 февраля 2019

Я все еще довольно новичок в языке программирования C #.Мне нужно создать программу бронирования авиабилетов, в которой пользователь будет вводить имя и выбирать пункт (номер места) в каждом из двух списков.Первый список включает в себя элементы A, B, C, D, E и второй список включает элементы 1,2,3.Всего 15 мест: А1, А2, А3, А4, А5, В1, В2, В3, В4, В5, С1, С2, С3, С4, С5, Д1, Д2, Д3, Д4, Д5, Е1, Е2,Е3, Е4, Е5.Программа требует, чтобы каждое место было выбрано один раз. Если одно место выбрано более одного раза, должно появиться сообщение о том, что это место уже выбрано. Когда я нажимаю кнопку «Забронировать», имя пассажира и номер места должны быть напечатаны в richtextbox1.(под кнопкой «Показать все»).

Я кодировал массив, чтобы принимать элементы списка для печати элементов в richtextbox вместе с именем пассажира.Все работает нормально, за исключением части кода (часть, которую я сделал комментарий), где я кодировал, если еще внутри цикла, чтобы проверить элементы массива с теми же значениями и сообщение, если условие выполнено.

Вот мой код:

    private void book_button_Click(object sender, EventArgs e)
    {
        string[,] newarray = new string[5, 3];


        if (textBox1.Text == "")
        {
            MessageBox.Show("Name is required");
        }
        if (listBox1.SelectedIndex == -1 && listBox2.SelectedIndex == -1)
        {
            MessageBox.Show("Seat Number is required");

        }
        else if (listBox1.SelectedIndex == -1 || listBox2.SelectedIndex == -1)
        {
            MessageBox.Show("Seat Number is required");
        }
        else
        {                
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 3; j++)
                {

                    newarray[i, j] = listBox1.GetItemText(listBox1.SelectedItem) + listBox2.GetItemText(listBox2.SelectedItem);
                    listBox1.ClearSelected();
                    listBox2.ClearSelected();
                    richTextBox1.Text += "" + textBox1.Text + "  " + newarray[i, j] + "";
                    textBox1.Text = string.Empty;

                }
            }
            richTextBox1.Text += "\n";
       /*for (int i = 0; i < 5; i++)
          {
            for (int j = 0; j < 5; j++)
            {
                if (newarray[i, 0] == newarray[j, 1])
                {
                    MessageBox.Show("This seat is already chosen");
                }
                if (newarray[i, 1]==newarray[j,2])
                {

                    MessageBox.Show("This seat is already chosen"); 
                }

            }
          }/*
        }
    }

Это не работает, и теперь каждый раз, когда я нажимаю на кнопку книги - появляется всплывающее сообщение о том, что это место уже выбрано. Я не знаю, гдеэта проблема.Это мой собственный подход, поэтому я не уверен, где я делаю что-то не так. Буду признателен за любую помощь.

Вот ссылка на графический интерфейс: если вы видите, что пользователям Джону и Джону назначено одно и то же место (D3) номер, который не должен иметь место.

enter image description here

1 Ответ

0 голосов
/ 07 февраля 2019

Необходимо сохранять состояние бронирования на уровне класса, а не на уровне метода, поскольку оно будет пустым после каждого нажатия кнопки «Забронировать».

Вы также должны проверить условия перед печатьюинформация о событии бронирования.

Таким образом, код должен выглядеть следующим образом:

public class Test
{
    private bool[,] bookingState = new bool[5,3];

    private void book_button_Click(object sender, EventArgs e) 
    {
        if (textBox1.Text == "")
        {
            MessageBox.Show("Name is required");
        }
        if (listBox1.SelectedIndex == -1 && listBox2.SelectedIndex == -1)
        {
            MessageBox.Show("Seat Number is required");

        }
        else if (listBox1.SelectedIndex == -1 || listBox2.SelectedIndex == -1)
        {
            MessageBox.Show("Seat Number is required");
        }

        // Now checking if the seat is booked
        string rowLetter = listBox1.GetItemText(listBox1.SelectedItem);
        // Insert checks for proper number format here
        int displayedRowSeatNumber = int.Parse(listBox2.GetItemText(listBox2.SelectedItem));
        // arrays are 0-based in C# so seat #1 would be at position 0.
        int rowSeatNumber = displayedRowSeatNumber - 1;


        // here you convert your row letter to row number for the booking array check
        // I'll use 1 for the example which is equivalent to B row
        int rowNumber = 1;

        if (bookingState[rowNumber, rowSeatNumber]) {
            MessageBox.Show("Seat has been booked!");
        }
        else {
            bookingState[rowNumber, rowSeatNumber] = true;
            // You can use string interpolation here as well
            richTextBox1.Text += textBox1.Text
                + " "
                + listBox1.GetItemText(listBox1.SelectedItem) 
                + listBox2.GetItemText(listBox2.SelectedItem)
                + "/n";
        }
    }
}

Если вы используете массив строк вместо массива bool, вы можете сохранить имя клиента и использовать егочтобы показать, кто именно забронировал рейс.

UPD : обновлен ответ с подготовкой значения перед проверкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...