Мой список просмотра показывает данные (в View.Details) только при первом запуске формы, после чего он по-прежнему принимает данные, которые просто не отображаются - PullRequest
0 голосов
/ 07 апреля 2019

Итак, для некоторого контекста:

Моя основная форма 'frmMenu' действует как форма меню домашнего интерфейса, которая имеет панель, которая закрепляет несколько других дочерних форм в контейнере MDI, и боковые кнопки для переключения между дочерними формами. Моя основная дочерняя форма 'frmEquipment' имеет Listview 'lstBasket', который действует как корзина, заполненная всем, что клиент хочет купить.

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

Примечание: перед добавлением элемента необходимо проверить, не существует ли элемент в lstBasket, чтобы предотвратить столкновения с количествами. Рядом с 'lstBasket' есть метка 'lblPrice', и каждый раз, когда новый элемент добавляется или изменяется, он обновляется с ценой корзины

Код работает хорошо, и мои функции для изменения количества, добавления новых элементов, пустых элементов работают без сбоев. Так что проблема не в том, как я добавляю или меняю элементы в lstBasket.

Позвольте мне объяснить, где возникает проблема:

Если я изменю, какую дочернюю форму я использую в 'frmMenu', скажем 'frmAdmin', а затем вернусь к 'frmEquipment'; когда я пытаюсь добавить элемент снова, все это подтверждается как обычно, и «frmEquipmentWindow» закрывается (что означает, что он добавлен в «lstBasket»), но «lstBasket» не отображает никаких данных.

Несмотря на то, что никакие данные не отображаются, если я попытаюсь добавить тот же элемент, появится моя проверка, сообщающая, что элемент уже находится в 'lstBasket', и не позволит мне добавить его. Тем не менее, «lblPrice», по-видимому, не обновляется и остается на £ 0,00 ???

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

//The code from frmEquipmentWindow that updates the ListView

frmEquipment form = (frmEquipment)Application.OpenForms["frmEquipment"];
                if (form.lstBasket.Items.Count != 0)
                {
                    for (int i = 0; i < form.lstBasket.Items.Count; i++)
                    {
                        string shortName = form.lstBasket.Items[i].SubItems[0].Text;
                        if (shortName == lblBrand.Text + " " + lblName.Tag.ToString())
                        {
                            MessageBox.Show("You already have that item in the basket");
                            basketCheck = true;
                            return;
                        }
                    }
                }
                if (basketCheck == false)
                {
                    DialogResult answer;
                    double totalPrice = itemPrice * temp;
                    answer = MessageBox.Show("The total price is £" + totalPrice.ToString("0.00") + " for  [" + temp + "]  " + lblName.Text, "Are you sure you want to add this to your basket?", MessageBoxButtons.OKCancel, MessageBoxIcon.None);
                    if (answer == DialogResult.OK)
                    {
                        form.lstBasket.Items.Add(lblBrand.Text + " " + lblName.Tag.ToString());
                        form.lstBasket.Items[form.lstBasket.Items.Count - 1].SubItems.Add(temp.ToString());
                        if (priceCheck)
                        {
                            form.lstBasket.Items[form.lstBasket.Items.Count - 1].SubItems.Add("£" + totalPrice.ToString());
                        }
                        else
                        {
                            form.lstBasket.Items[form.lstBasket.Items.Count - 1].SubItems.Add("£" + totalPrice.ToString() + ".00");
                        }
                        form.lstBasket.View = View.Details;
                        form.updateBasketPrice();
                        GlobalVariables.itemsInBasket = true;
                        this.Close();
                        return;
                    }
                    else
                    {
                        return;
                    } 
                }

Я не объявляю ListView в коде, но он генерируется в классе Designer для формы:

        // 
        // lstBasket
        // 
        this.lstBasket.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
        this.clmN,
        this.clmQ,
        this.clmP});
        this.lstBasket.FullRowSelect = true;
        this.lstBasket.Location = new System.Drawing.Point(739, 117);
        this.lstBasket.MultiSelect = false;
        this.lstBasket.Name = "lstBasket";
        this.lstBasket.Size = new System.Drawing.Size(303, 379);
        this.lstBasket.TabIndex = 5;
        this.lstBasket.UseCompatibleStateImageBehavior = false;
        this.lstBasket.View = System.Windows.Forms.View.Details;
        this.lstBasket.SelectedIndexChanged += new System.EventHandler(this.lstBasket_SelectedIndexChanged);
        // 
        // clmN
        // 
        this.clmN.Text = "Name";
        this.clmN.Width = 156;
        // 
        // clmQ
        // 
        this.clmQ.Text = "Quantity";
        this.clmQ.Width = 65;
        // 
        // clmP
        // 
        this.clmP.Text = "Price";
        this.clmP.Width = 85;
...