Значение Winforms в DataGridView, отредактированное значение FormattedValue

#c# #winforms #datagridview

#c# #winforms #datagridview

Вопрос:

Я создаю одно приложение, в котором пользователь заполняет счет-фактуру, используя DataGridView.

В каждой строке DGV есть 4 столбца:
creditOrDebit,Customer,Credit,Debit.

creditOrDebit может иметь 2 значения: BY или TO 1) Если оно относится К ячейке, то кредит будет доступен только для чтения с фиксированным значением 0.00, а дебет будет заполнен пользователем. 2) Если оно указано в ячейке, дебет будет доступен только для чтения с фиксированным значением 0.00, а кредит будет заполнен пользователем.

После окончания каждой строки будут вычислены кредит и дебет, и если будет добавлен кредит> дебет В строку, будет добавлено еще по строке, пока кредит = дебет.

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

 decimal credit = 0;
decimal debit = 0;

foreach (DataGridViewRow row in dataGridViewReceipts.Rows)
{
   if (row.Cells[2].Value != null)
      credit  = decimal.Parse(row.Cells[2].Value.ToString());
   else
      credit  = decimal.Parse(row.Cells[2].EditedFormattedValue.ToString());


   if (row.Cells[3].Value != null)
      debit  = decimal.Parse(row.Cells[3].Value.ToString());
   else
      debit  = decimal.Parse(row.Cells[3].EditedFormattedValue.ToString());
}
labelCredit.Text = credit.ToString();
labelDebit.Text = debit.ToString();
  

Это сработало отлично. Но когда дело доходит до редактирования счета-фактуры, я заполняю все из базы данных и позволяю пользователю редактировать это.

 dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnDirection"].Value = "BY";
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnParty"].Value = dr["PartyName"].ToString();
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnParty"].Tag = dr["PartyID"].ToString();
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnCredit"].Value = dr.GetDecimal(dr.GetOrdinal("Amount"));
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnCredit"].ReadOnly = false;
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnDebit"].Value = "0.00";
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnDebit"].ReadOnly = true;
  

Теперь, когда я использую код, который вычисляет кредит и дебет, значение Cell.Value никогда не становится нулевым, поэтому всегда используется значение (новое отредактированное значение отображается в EdittedFormattedValue), что приводит к неправильным результатам.

Пожалуйста, предложите подходящее решение.

Комментарии:

1. Тогда я совершенно неправильно понял ваш вопрос .. пожалуйста, приведите более наглядный пример того, в чем проблема.

Ответ №1:

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

Отредактированное форматированное значение — это текущее форматированное значение ячейки, независимо от того, находится ли ячейка в режиме редактирования и значение не было зафиксировано.

Комментарии:

1. Есть ли какой-либо способ автоматически зафиксировать ячейку после ее редактирования?

2. Попробуйте зафиксировать событие изменения значения ячейки или установите cell.value = cell.editedFormattedText.