Как редактировать / добавлять / обновлять сетку данных непосредственно в приложении Windows Forms - PullRequest
0 голосов
/ 15 мая 2019

Я создаю приложение Windows Forms, которое управляет отелем. Есть классы Клиента, Комнаты, Занятия. У Client и Rooms есть ArrayList, который заполняется во время выполнения из файла .txt, который затем отображается в clientListView и roomDataGridView.

Таким образом, у меня есть эта строка кода для заполнения номеровDGV:

roomsDGV.DataSource = roomsArrayList;

С помощью roomsDGV я пытаюсь добавить новые строки, нажимая на roomsDGV, например, когда он НЕ связан с данными. Я также пытаюсь отредактировать строки и сохранить их в текстовый файл после редактирования или во время редактирования. Я могу разместить больше кода по мере необходимости, но я не уверен, поможет ли показ большего кода в текущий момент. В конце я пытаюсь получить функциональность, чтобы выделить клиента в списке, щелкнуть одну из строк в roomsDGV и назначить этот clientID для этой комнаты или любым другим способом.

При загрузке, сетка данных загружается и корректно форматируется из arrayList, но у меня, похоже, есть проблема с возможностью редактировать сетку данных. Это дает мне эту ошибку, когда я нажимаю на одну из строк:

System.IndexOutOfRangeException: 'Index -1 does not have a value.'

Это происходит из Application.Run (новый HotelManager ());

Вот форма:

public partial class HotelManager : Form
{
    // VARIABLES
    string clientID;
    // FILEPATHS
    string clientsTxt = "Clients.txt";
    string occupanciesTxt = "Occupancies.txt";
    string roomsTxt = "Rooms.txt";
    string clientsDat = "Clients.dat";

    // ARRAYLIST FOR ROOMS and CLIENTS
    ArrayList roomsArrayList = new ArrayList();
    ArrayList clientsArrayList = new ArrayList();

    //STACKS AND QUEUES INIT
    // Load occupancies into stack > pop
    Stack roomStack = new Stack();
    Queue vacancyQueue = new Queue();

    // RANDOM for ID
    private readonly Random rand = new Random();

    public HotelManager()
    {
        InitializeComponent();
    }

    private void HotelManager_Load(object sender, EventArgs e)
    {
        roomsDGV.DataSource = roomsArrayList;
        // LOAD clients
        // LoadClients();
        RefreshClientList();
        // LOAD rooms
        LoadRooms();
    }
    private void NewClientButton_Click(object sender, EventArgs e)
    {
        AddClient();
    }
    private void checkInButton_Click(object sender, EventArgs e)
    {
        string clientID = clientList.SelectedItems[0].Text;
        string[] text = File.ReadAllLines(occupanciesTxt);
        foreach (string s in text)
        {
            if (s.Contains(clientID))
            {
                var replace = s;
                Console.WriteLine(s);
                replace = replace.Replace("false", "true");
            }
        }
        File.WriteAllLines(occupanciesTxt, text);
    }

    // METHODS

    private void AddClient()
    {
        //COLLECT DATA > CREATE NEW client > SHOW IN **PROGRAM/DataGridView** > add to clients file
        // ID GENERATION > CHECKS AGAINST clientsTXT
        clientID = rand.Next(0, 999999).ToString();
        if (File.ReadLines(clientsTxt).Contains(clientID))
        {
            clientID = rand.Next(0, 999999).ToString();
        }
        Client client = new Client(clientID, firstNameBox.Text, lastNameBox.Text);
        try
        {
            if (!string.IsNullOrWhiteSpace(phoneNumBox.Text))
            {
                client.PhoneNumber = Convert.ToInt64(phoneNumBox.Text);
            }
            if (!string.IsNullOrWhiteSpace(addressBox.Text))
            {
                client.Address = addressBox.Text;
            }
        }
        catch (Exception)
        {
            MessageBox.Show("Please use the correct format!");
            throw;
        }
        clientsArrayList.Add(client);
        using (StreamWriter file =
        new StreamWriter("Clients.txt", true))
        {
            file.WriteLine(client.ToString());
        }
        RefreshClientList();
        // TEST CODE // SERIALIZATION TO .DAT
        SerializeClientData(client);
    }
    private void LoadClients()
    {
        // LOADS arrayList FROM .txt FILE
        List<string> clientList = File.ReadAllLines(clientsTxt).ToList();
        foreach (var c in clientList)
        {
            Client client = new Client(c);
            clientsArrayList.Add(client);
        }
    }

    private void LoadRooms()
    {
        List<string> roomsList = File.ReadAllLines(roomsTxt).ToList();
        foreach (var r in roomsList)
        {
            var roomDetails = r.Split('|');
            if (r.Contains("BASIC"))
            {
                BasicRoom basic = new BasicRoom();
                basic.RoomNumber = roomDetails[0];
                basic.NumberOfBeds = Convert.ToInt32(roomDetails[1]);
                basic.Balcony = Convert.ToBoolean(roomDetails[2]);
                basic.DownForRepair = Convert.ToBoolean(roomDetails[3]);
                basic.Smoking = Convert.ToBoolean(roomDetails[4]);
                roomsArrayList.Add(basic);

            }
            else if (r.Contains("SUITE"))
            {
                Suite suite = new Suite();
                suite.RoomNumber = roomDetails[0];
                suite.NumberOfBeds = Convert.ToInt32(roomDetails[1]);
                suite.Balcony = Convert.ToBoolean(roomDetails[2]);
                suite.DownForRepair = Convert.ToBoolean(roomDetails[3]);
                suite.NumberOfRooms = Convert.ToInt32(roomDetails[4]);
                roomsArrayList.Add(suite);
            }
        }
        roomStack = new Stack(roomsArrayList);
        foreach (var item in roomStack)
        {
            Console.WriteLine(item);
        }
    }

    private void RoomsDGV_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }

    private void RoomsDGV_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {

    }
}

Пока что я просмотрел все объекты, но не могу найти подходящий. Я знаю, что могу добавить / использовать списки и т.д. для добавления нового элемента в arrayList, но я пытаюсь использовать функциональность просмотра данных

Я ожидаю редактировать и добавлять строки в DGV, но что-то в конструкторе мешает мне? Вот DGV, и нажатие на любую из строк нарушает его. https://imgur.com/a/GG7ZwdV

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