Member 14153150 Ответов: 1

Колонка управления datagridview показывает только значений ячеек на физическую кнопку


У меня есть метод под названием Search(), его задача состоит в том, чтобы получить много заказов на покупку и показать их в datagridview в виде BindingList, но добавить дополнительный столбец вручную. Проблема в том, что все работает правильно, когда я физически нажимаю кнопку поиска, однако когда я вызываю метод в событии загрузки формы, он будет работать, за исключением того, что дополнительный столбец, который я добавил вручную, не показывает значения своих ячеек, он будет показывать их только после того, как я нажму кнопку.

private void Search()
        {
            dgvResults.DataSource = null;
            List<PurchaseOrder> pos = new List<PurchaseOrder>();

            // Check if search criteria is valid
            bool searchCriteriaOk = false;
            if (rdoById.Checked && txtSearch.Text.Length == 8)
            {
                pos = service.GetPurchaseOrders(1, LoginData.EmployeeId, Convert.ToInt32(txtSearch.Text), DateTime.Today, DateTime.Today, null);
                searchCriteriaOk = true;
            }
            else if (rdoById.Checked && txtSearch.Text.Length != 8)
            {
                MessageBox.Show("The purchase order id must be 8 digits long");
            }
            else if (rdoByDate.Checked && dtpStart.Value < dtpEnd.Value)
            {
                POStatus? status = null;
                if (rdoPending.Checked)
                {
                    status = POStatus.Pending;
                }
                if (rdoClosed.Checked)
                {
                    status = POStatus.Closed;
                }
                pos = service.GetPurchaseOrders(2, LoginData.EmployeeId, 0, dtpStart.Value, dtpEnd.Value, status);
                searchCriteriaOk = true;
            }
            else if (rdoByDate.Checked && !(dtpStart.Value < dtpEnd.Value))
            {
                MessageBox.Show("Start date must be less than end date");
            }

            if (searchCriteriaOk)
            {
                if (pos.Count > 0)
                {
                    if (LoginData.EmployeeType == EmployeeType.RegularEmployee || LoginData.EmployeeType == EmployeeType.HREmployee)
                    {
                        foreach (var po in pos.ToList())
                        {
                            if (po.EmployeeId != LoginData.EmployeeId)
                            {
                                pos.Remove(po);
                            }
                        }
                    }

                    dgvResults.DataSource = new BindingList<PurchaseOrder>(pos);
                    dgvResults.Columns["TotalAfterTax"].DefaultCellStyle.Format = "c2";
                    foreach (DataGridViewColumn column in dgvResults.Columns)
                    {
                        if (column.Name != "PurchaseOrderId" && column.Name != "CreationDate" && column.Name != "TotalAfterTax")
                        {
                            column.Visible = false;
                        }

                        if (column.Name == "PurchaseOrderId")
                        {
                            column.HeaderText = "PO Number";
                        }

                        if (column.Name == "CreationDate")
                        {
                            column.HeaderText = "Date";
                        }

                        if (column.Name == "TotalAfterTax")
                        {
                            column.HeaderText = "Total";
                        }
                    }

                    if (dgvResults.Columns["PoItems"] != null)
                    {
                        dgvResults.Columns.Remove("PoItems");
                    }

                    dgvResults.Columns.Add("PoItems", "Items");
                    foreach (DataGridViewRow row in dgvResults.Rows)
                    {
                        string itemToAddToDgv = "";
                        int poId = Convert.ToInt32(row.Cells["PurchaseOrderId"].Value);
                        foreach (PurchaseOrder purchaseOrder in pos.ToList())
                        {
                            if (purchaseOrder.PurchaseOrderId == poId)
                            {
                                foreach (Item item in purchaseOrder.Items.ToList())
                                {
                                    itemToAddToDgv += " *" + item.Name;
                                }
                            }
                        }
                        row.Cells["PoItems"].Value = itemToAddToDgv;
                    }

                    dgvResults.Rows[0].Selected = true;
                }
                else
                {
                    MessageBox.Show("No Purchase Orders found");
                }
            }
        }


Что я уже пробовал:

Я даже пытался вызвать метод .PerformClick() при загрузке формы, но он не работает

Maciej Los

Вы пытались отладить свою программу, чтобы выяснить, почему процедура поиска не запускается?

Richard MacCutchan

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

1 Ответов

Рейтинг:
9

Member 14153150

Я решил эту проблему, добавив новое свойство в модель вместо добавления столбца после привязки списка