Я не уверен, «почему» вы хотите сохранить значение «COST», поскольку string.
Cost подразумевает числовое значение decimal
, и оно «должно» храниться в БД как decimal
или другое числовое значение, но НЕ как string.
Это будет создавать больше работы каждый раз, когда string
используется в числовом контексте… как в вашем текущем случае.
Кроме того, это может оставить БД в несогласованном состоянии, если какой-либо пользователь введет «Hello» в качестве значения «Cost». Что-то пахнет рыбой, и это, казалось бы, на самом деле «создает» проблемы.
По какой-то причине вы сохраняете значение «Стоимость» как string
?
Установка формата ячеек на «c2» ничего не даст, «когда» столбец «тип» имеет значение string.
.
При форматировании ячейка должна иметь правильный «тип», чтобы форматировать ее правильно. В этом случае тип decimal
будет работать для денежного значения.
Также следует отметить, что если ваш код «вручную» добавляет столбцы в сетку, то строки кода…
dataGridView1.Columns[14].DefaultCellStyle.Format = "c2";
dataGridView1.Columns[14].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");
… явно не будет работать ДО добавления этих столбцов.
То же самое применимо при использовании DataSource.
. Сначала вы добавляете DataSource
, ТОГДА код форматирует столбец (столбцы).
Опять же, все это кажется очень странным хранить значение decimal
в БД как string.
. Я делаю это предположение, поскольку ваш код технически «мог бы» преобразовать значение decimal
в БД в string
в запросе. Если это так, то простое исправление состоит в том, чтобы изменить запрос, чтобы не преобразовывать значение в string.
.
Ниже приведен пример того, что описано выше. В примере используется DataTable
вместо DataSource.
. Он имеет два столбца, так что первый столбец имеет тип decimal
, а второй столбец имеет тип string
. В таблицу добавлено несколько строк, так что каждая строка имеет «одинаковое» значение в каждом столбце.
![введите здесь описание изображения](https://i.stack.imgur.com/fTRkp.jpg)
Когда форматирование применяется после установки DataSource
сетки, должно быть ясно, что форматирование «игнорируется» для ячеек типа string
и применяется к ячейкам типа decimal
.
Поскольку для информации о культуре установлено значение «fr-FR», «десятичная точка» НЕ используется. Поэтому, когда пользователь вводит числа, ему нужно использовать «запятую» там, где он хочет, чтобы был десятичный разряд.
Для полного примера поместите DataGridView
в форму и используйте приведенный ниже код, чтобы проверить, что описано выше. Я надеюсь в этом есть смысл.
private void Form1_Load(object sender, EventArgs e) {
dataGridView1.DataSource = GetTable();
dataGridView1.Columns[0].DefaultCellStyle.Format = "c2";
dataGridView1.Columns[0].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");
dataGridView1.Columns[1].DefaultCellStyle.Format = "c2";
dataGridView1.Columns[1].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");
}
private DataTable GetTable() {
DataTable dt = new DataTable();
dt.Columns.Add("Col0", typeof(decimal));
dt.Columns.Add("Col1", typeof(string));
dt.Rows.Add(12.345, 12.345);
dt.Rows.Add(1.35, 1.35);
dt.Rows.Add(112.555, 112.555);
dt.Rows.Add(12.333, 12.333);
return dt;
}
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) {
Debug.WriteLine("Error at Row: " + e.RowIndex + " Col: " + e.ColumnIndex);
Debug.WriteLine("Error is:" + e.Exception.Message);
Debug.WriteLine("Value is:" + dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue);
}
person
JohnG
schedule
31.12.2020