Как добавить пользовательские столбцы в DataGridView после загрузки из DataTable - PullRequest
0 голосов
/ 30 апреля 2019

В приложении Windows Form есть DataGridView с полями текстовых полей. Когда данные вводятся в поле Textbox, DataGridView перезагружается.

Я запрашиваю свой SQL-сервер и генерирую DataTable на основе результатов. Затем я загружаю эти результаты в DataGridView.
Я хочу добавить несколько дополнительных столбцов в DataGridView. Я добавил их в свой код ниже, однако, когда функция вызывается снова, она добавляет еще один набор столбцов к уже существующему определению DataGridView. Если я обновляю данные несколько раз, каждый раз добавляется новый набор.

Если я добавлю их до загрузки DataGridView из DataTable, то сначала будут добавлены столбцы, а это не то, что мне нужно.

Стоит ли как-нибудь стереть DataGridView перед загрузкой? Нужно ли проверять, существует ли столбец перед созданием?

Какой самый лучший вариант здесь?

private void FillTable(string location, string supplier, string item) {
        string sql = "";
        string connString = "Data Source=B606SQLERP;Initial Catalog=P21DCImport17;Integrated Security=true;";

        // If ONLY Location is entered
        if (location != "" && supplier == "" && item == "") {
            MessageBox.Show("Only Location");
            sql = "SELECT " +
                    "      location_id AS 'Location', " +
                    "      supplier_id AS 'Supplier', " +
                    "      item_id AS 'Item', " +
                    "      recommended_qty_to_order AS 'Rec Qty'" +
                    "  FROM PorgReqs  " +
                    "  WHERE location_id = @LocationID " +
                    "  ORDER BY supplier_id, item_id";

        }

        // If ONLY Supplier is entered
        if (location == "" && supplier != "" && item == "") {
            MessageBox.Show("Only Supplier");
            sql = "SELECT " +
                    "      location_id AS 'Location', " +
                    "      supplier_id AS 'Supplier', " +
                    "      item_id AS 'Item', " +
                    "      recommended_qty_to_order AS 'Rec Qty'" +
                    "  FROM PorgReqs  " +
                    "  WHERE supplier_id = @SupplierID " +
                    "  ORDER BY location_id, item_id";

        }

        // If ONLY Item is entered
        if (location == "" && supplier == "" && item != "") {
            MessageBox.Show("Only Item");
            sql = "SELECT " +
                    "      location_id AS 'Location', " +
                    "      supplier_id AS 'Supplier', " +
                    "      item_id AS 'Item', " +
                    "      recommended_qty_to_order AS 'Rec Qty'" +
                    "  FROM PorgReqs  " +
                    "  WHERE item_id = @ItemID " +
                    "  ORDER BY location, supplier_id";

        }


        // Creates Connection, Sets Variables in Connection and tries to load table
        using (SqlConnection conn = new SqlConnection(connString)) {
            SqlCommand cmd = new SqlCommand(sql, conn);

            // Sets Variables
            cmd.Parameters.AddWithValue("@LocationID", txtLocation.Text);
            cmd.Parameters.AddWithValue("@SupplierID", txtSupplier.Text);
            cmd.Parameters.AddWithValue("@ItemID", txtItem.Text);

            // Opens Connection
            conn.Open();

            try 
            {
                // Creates Reader Object
                SqlDataReader sqlDataReader = cmd.ExecuteReader();


                // Fill the list box with the values retrieved
                if (sqlDataReader.HasRows) {
                    // Create DataTable
                    DataTable dt = new DataTable();

                    // Add Columns to DataTable
                    dt.Columns.Add("Location");
                    dt.Columns.Add("Supplier");
                    dt.Columns.Add("Item");
                    dt.Columns.Add("Rec Qty");
                    dt.Load(sqlDataReader);

                    gridData.DataSource = dt;

                    DataGridViewTextBoxColumn txtAddlQty = new DataGridViewTextBoxColumn();
                    txtAddlQty.Name = "AddlQty";
                    txtAddlQty.HeaderText = "Add'l Qty";
                    txtAddlQty.Width = 75;
                    gridData.Columns.Add(txtAddlQty);

                    DataGridViewTextBoxColumn txtFinalQty = new DataGridViewTextBoxColumn();
                    txtFinalQty.Name = "FinalQty";
                    txtFinalQty.HeaderText = "Final Qty";
                    txtFinalQty.Width = 75;
                    gridData.Columns.Add(txtFinalQty);

                    DataGridViewComboBoxColumn cboAction = new DataGridViewComboBoxColumn();
                    cboAction.Name = "Action";
                    cboAction.HeaderText = "Action";
                    cboAction.Items.AddRange("Buy", "Transfer", "Not Buy");
                    cboAction.Width = 75;
                    gridData.Columns.Add(cboAction);

                    DataGridViewCheckBoxColumn chkApprove = new DataGridViewCheckBoxColumn();
                    chkApprove.Name = "Approve";
                    chkApprove.HeaderText = "Approve";
                    chkApprove.Width = 50;
                    gridData.Columns.Add(chkApprove);

                    gridData.Columns["Location"].Width = 60;
                    gridData.Columns["Supplier"].Width = 60;
                    gridData.Columns["Item"].Width = 125;
                    gridData.Columns["Rec Qty"].Width = 75;

                    // Adds default value to the Action column
                    foreach (DataGridViewRow row in gridData.Rows) {
                        row.Cells["Action"].Value = "Buy";
                    }
                }

            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
                MessageBox.Show(ex.Message);
            }
        }
    } // End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...