DataGridView не сохраняет программные изменения в ячейках - PullRequest
1 голос
/ 21 апреля 2019

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

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

    private void dgvItemsTable_CellValueChanged ( object sender, DataGridViewCellEventArgs e )
    {

      if ( dgvItemsTable.Columns[e.ColumnIndex].Name == soldColumn &&
        (bool)dgvItemsTable.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == true )
      {
        formSoldItemPopup.FillComboBoxAutoComplete ( dataSetItems, expenseTypeColumn, true ); 
        DialogResult dialogResult = formSoldItemPopup.ShowDialog ();
        if ( dialogResult == DialogResult.OK )
        {
          dgvItemsTable.BeginEdit ( true );

          dgvItemsTable.Rows[e.RowIndex].Cells[salesChannelIDColumn].Value = Int32.Parse ( salesChannelID );
          dgvItemsTable.Rows[e.RowIndex].Cells[salePriceColumn].Value = formSoldItemPopup.SalePrice;
          dgvItemsTable.Rows[e.RowIndex].Cells[saleDateColumn].Value = formSoldItemPopup.SaleDate;
          dgvItemsTable.Rows[e.RowIndex].Cells[expensesColumn].Value = formSoldItemPopup.Expenses;
          dgvItemsTable.Rows[e.RowIndex].Cells[expenseTypeColumn].Value = formSoldItemPopup.ExpenseType;
          dgvItemsTable.Rows[e.RowIndex].SetValues ();

          dgvItemsTable.EndEdit ();

          UpdateItemsDatabase ();      
        }
      }
    }


    private void dgvItemsTable_CurrentCellDirtyStateChanged ( object sender, EventArgs e )
    {
      if ( dgvItemsTable.IsCurrentCellDirty )
      {
        dgvItemsTable.CommitEdit ( DataGridViewDataErrorContexts.CurrentCellChange );
      }
    }


    private void dgvItemsTable_CellEndEdit ( object sender, DataGridViewCellEventArgs e )
    {
      UpdateItemsDatabase ();
    }

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

DataRow dataRow = ( (DataRowView)dgvItemsTable.SelectedRows[0].DataBoundItem ).Row;
dataRow.BeginEdit ();
dataRow[salesChannelIDColumn] = Int32.Parse ( salesChannelID );
dataRow[salePriceColumn] = formSoldItemPopup.SalePrice;
dataRow[saleDateColumn] = formSoldItemPopup.SaleDate;
dataRow[expensesColumn] = formSoldItemPopup.Expenses;
dataRow[expenseTypeColumn] = formSoldItemPopup.ExpenseType;
dataRow.EndEdit ();
dataRow.AcceptChanges ();

ОБНОВЛЕНИЕ

Итак, у меня был некоторый успех с приведенным ниже кодом - но ТОЛЬКО если я не включил две строки для всплывающей формы.Какой тип побеждает цель - мне нужны детали из формы, чтобы заполнить строку.: - (

У кого-нибудь есть идеи, почему форма препятствует успешному обновлению строки?

    private void button1_Click ( object sender, EventArgs e )
    {
      currentColumnBeingEdited = dgvItemsTable.CurrentCell.ColumnIndex;
      currentRowBeingEdited = dgvItemsTable.CurrentCell.RowIndex;
      string salesChannelID =
        dgvSelectedSalesChannel.Rows[dgvSelectedSalesChannel.Rows.Count - 1].Cells[salesChannelIDColumn].Value.ToString ();

      formSoldItemPopup.FillComboBoxAutoComplete ( dataSetItems, expenseTypeColumn, true );
      formSoldItemPopup.ShowDialog ();

      dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[soldColumn];
      dgvItemsTable.Rows[currentRowBeingEdited].Cells[soldColumn].Value = true;
      dgvItemsTable.BeginEdit ( false );
      dgvItemsTable.EndEdit ();
      dgvItemsTable.NotifyCurrentCellDirty ( true );

      dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[salesChannelIDColumn];
      dgvItemsTable.Rows[currentRowBeingEdited].Cells[salesChannelIDColumn].Value = salesChannelID;
      dgvItemsTable.BeginEdit ( false );
      dgvItemsTable.EndEdit ();
      dgvItemsTable.NotifyCurrentCellDirty ( true );

      dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[saleDateColumn];
      dgvItemsTable.Rows[currentRowBeingEdited].Cells[saleDateColumn].Value = formSoldItemPopup.SaleDate;
      dgvItemsTable.BeginEdit ( false );
      dgvItemsTable.EndEdit ();
      dgvItemsTable.NotifyCurrentCellDirty ( true );

      dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[salePriceColumn];
      dgvItemsTable.Rows[currentRowBeingEdited].Cells[salePriceColumn].Value = formSoldItemPopup.SalePrice;
      dgvItemsTable.BeginEdit ( false );
      dgvItemsTable.EndEdit ();
      dgvItemsTable.NotifyCurrentCellDirty ( true );

      dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[expensesColumn];
      dgvItemsTable.Rows[currentRowBeingEdited].Cells[expensesColumn].Value = formSoldItemPopup.Expenses;
      dgvItemsTable.BeginEdit ( false );
      dgvItemsTable.EndEdit ();
      dgvItemsTable.NotifyCurrentCellDirty ( true );

      dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[expenseTypeColumn];
      dgvItemsTable.Rows[currentRowBeingEdited].Cells[expenseTypeColumn].Value = formSoldItemPopup.ExpenseType;
      dgvItemsTable.BeginEdit ( false );
      dgvItemsTable.EndEdit ();
      dgvItemsTable.NotifyCurrentCellDirty ( true );


      dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited + 1].Cells[itemIDColumn];

      dgvItemsTable.CommitEdit ( DataGridViewDataErrorContexts.CurrentCellChange );
      dgvItemsTable.EndEdit ();

      UpdateItemsDatabase ();

    }

1 Ответ

0 голосов
/ 24 апреля 2019

Хорошо, я наконец узнал, что происходит. Отслеживая изменения в DataTable, я обнаружил, что принятие изменений на уровне DataRow очистило изменения на уровне DataTable. Ниже приведен окончательный код, который отлично работает.

     DataTable dataTableSold = dataSetItems.Tables["Table"];
     DataRow[] dataRowSold = dataTableSold.Select ( "[" + itemIDColumn + "] = '" + itemID + "'" );

     dgvItemsTable.BeginEdit ( false );
     dataRowSold[0].BeginEdit ();
     dataRowSold[0][salesChannelIDColumn] = salesChannelID;
     dataRowSold[0][salePriceColumn] = formSoldItemPopup.SalePrice;
     dataRowSold[0][saleDateColumn] = formSoldItemPopup.SaleDate;
     dataRowSold[0][expensesColumn] = formSoldItemPopup.Expenses;
     dataRowSold[0][expenseTypeColumn] = formSoldItemPopup.ExpenseType;
     dataRowSold[0].EndEdit ();

     dgvItemsTable.Update ();
     UpdateItemsDatabase ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...