Как добавить строку в таблицу данных при нажатии кнопки?

В Windows Forms я хочу добавить строку за строкой в ​​DataGridView при нажатии кнопки, принимая значения из других элементов управления. В этом случае я использую DataTable, и он привязан к DataGridView.

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

private void btnAddToGrid_Click(object sender, EventArgs e)
{
        LoadDataGridView();
}

private void LoadDataGridView()
{
        dgvAdjustment.DataSource = GetAdjustmentTable();
}

private DataTable GetAdjustmentTable()
{
        DataTable adjustmentTable = new DataTable();

        DataColumn dataColumn;
        dataColumn = new DataColumn("SourceOutletID", typeof(int));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("DestinationOutletID", typeof(int));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("TransactionDate", typeof(DateTime));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("MaterialName", typeof(string));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("AdjustmentType", typeof(int));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("CurrentBalance", typeof(decimal));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("AdjustmentQty", typeof(decimal));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("NewBalance", typeof(decimal));
        adjustmentTable.Columns.Add(dataColumn);

        DataRow dataRow = adjustmentTable.NewRow();
        dataRow[0] = cmbSourceOutlet.SelectedValue;
        dataRow[1] = cmbDestinationOutlet.SelectedValue;
        dataRow[2] = TransDateTimePicker.Value;
        dataRow[3] = cmbMaterialName.SelectedValue;
        dataRow[4] = cmbAdjustmentType.SelectedValue;
        dataRow[5] = Convert.ToDecimal(lblCurBalVal.Text);
        dataRow[6] = Convert.ToDecimal(lblAdjVal.Text);
        dataRow[7] = Convert.ToDecimal(lblNewQtyVal.Text);

        int insertPosition = adjustmentTable.Rows.Count;
        adjustmentTable.Rows.InsertAt(dataRow, insertPosition);

        return adjustmentTable;
}

В приложениях ASP .NET я использую состояние сеанса, чтобы проверить, является ли DataTable пустым, используя следующий код:

protected void Button1_Click(object sender, EventArgs e)
{
  try
  {
     //Check if previous session is exist
     if (Session["MyTable"] == null)
     {
         dtMyTable = new DataTable("MyTable");
         dtMyTable.Columns.Add("Id", typeof(int));
         dtMyTable.Columns.Add("LName", typeof(string));

     }
     else
     {
         //If yes then get it from current session
         dtMyTable = (DataTable)Session["MyTable"];
     }

     //Add new row every time
     DataRow dt_row;
     dt_row = dtMyTable.NewRow();
     dt_row["Id"] = TextBox1.Text;
     dt_row["LName"] = TextBox2.Text;
     dtMyTable.Rows.Add(dt_row);

     //Update session table
     Session["MyTable"] = dtMyTable;
  }
  catch (Exception ex)
  {

     Response.Write(ex.Message);
  }
}

Что я могу сделать и как внести изменения, чтобы получить правильное решение в Windows Forms? Любая помощь будет высоко ценится!


person Aung Kaung Hein    schedule 04.11.2013    source источник


Ответы (1)


В GetAdjustmentTable вы каждый раз воссоздаете adjustmentTable. Таким образом, новая строка просто перезапишет существующую.

Вам нужно изменить код так, чтобы adjustmentTable создавался только один раз, а последующие вызовы добавляли к нему строки. Один из способов сделать это - сделать его закрытым полем и проверить, является ли оно нулевым, и создать его, если оно есть:

private DataTable _adjustmentTable;

private DataTable GetAdjustmentTable()
{
    if (adjustmentTable == null)
    {
        adjustmentTable = new DataTable();
    }
    ....
person David Arno    schedule 04.11.2013
comment
Ты абсолютно прав! Я объявил DataTable вне метода и проверил, является ли DataTable нулевым. Спасибо за вашу помощь. - person Aung Kaung Hein; 04.11.2013