В приложении 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