Использование формата в DataGridView

У меня есть некоторые проблемы с моим DGV, DGV ограничен таблицей данных с как минимум 30 столбцами (все ожидают PK и FK, задаются как строки), теперь есть конкретный столбец, который является стоимостью продукта, который я хочу сделать это как этот пример: 359,99 €, каждый раз, когда пользователь щелкает ячейку этого столбца, он показывает нулевое значение 0,00 €, символ валюты нельзя редактировать внутри ячейки, так же как и разделитель точек.

Итак, это моя цель, и я пытаюсь сделать все, что я упомянул в форме Windows, я пытался использовать код, однако это ничего не сделало. В конце концов, какие шаги я должен предпринять для желаемого результата?

Я попробовал следующий код для этого столбца, однако, как я уже говорил, он ничего не делает, хотя я нашел аналогичный моему вопрос в StarkOverflow, кажется, может быть, что я должен ввести этот код перед привязкой к DGV (на самом деле я не не связывать его кодом, я думаю, что мне это сейчас не нужно), но я думаю, что это невозможно, потому что мне нужно связать DGV, чтобы я мог его редактировать (есть также один несвязанный столбец, содержащий кнопки удаления для строк , но я не думаю, что это имеет значение здесь):

            advancedDataGridView1.Columns[14].DefaultCellStyle.Format = "c2";
            advancedDataGridView1.Columns[14].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");

Заранее спасибо.


person Linascts    schedule 31.12.2020    source источник
comment
Вы говорите, что храните стоимость в виде строки, и формат не будет с ней работать?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 31.12.2020


Ответы (1)


Я не уверен, «почему» вы хотите сохранить значение «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. В таблицу добавлено несколько строк, так что каждая строка имеет «одинаковое» значение в каждом столбце.

введите здесь описание изображения

Когда форматирование применяется после установки 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
comment
Спасибо за ваш ответ, и да, я понимаю, что не логично использовать строку для стоимости, однако моя ситуация такова, что я использую расширенный datagridview со встроенным фильтром, мне это очень нравится, и это необходимо для моей цели, хотя когда я пытаюсь отсортировать числовой тип, программа падает, а если я использую ее в столбце со строкой, содержащей числа, она очень хорошо сортируется для меня. Вот почему я решил сделать все на веревке, а потом что-нибудь придумать. Может быть, был более простой способ сделать все, не реконструируя все, но у меня действительно ограниченные знания о базах данных. - person Linascts; 01.01.2021
comment
Кажется, я понял, что теперь делать! Благодарю вас! - person Linascts; 01.01.2021
comment
Я должен спросить, если ваши числовые значения являются строками, при сортировке эти строки не будут отсортированы как... 1, 10, 12, 14, 2, 21, 22, 3, 31... и т.д.... в Другими словами, числа не сортируются должным образом, когда они являются строками. - person JohnG; 01.01.2021
comment
@Linas MitkevičiusIf … посмотрите мой пример кода; первый столбец будет отсортирован правильно, если щелкнуть заголовок столбца. Он не будет правильно сортировать строковый столбец. Я должен спросить… ваш код добавляет строки в сетку «вручную»? Или сетка использует DataSource? Использование DataSource является лучшим подходом, так как добавление строк вручную создаст для вас дополнительную работу. Вы используете DataSource для сетки? - person JohnG; 01.01.2021
comment
@Linas MitkevičiusIf … При использовании встроенной расширенной сетки она не сортировала и не фильтровала для меня независимо от того, был ли столбец строкой или числовым значением. Делаете ли вы что-нибудь с кодом для достижения этой фильтрации и сортировки? Я не хочу отговаривать вас от использования расширенной сетки, однако обычная сетка будет отлично сортировать и фильтровать, если все сделано правильно. Буду считать, что что-то упускаю. Удачи. - person JohnG; 01.01.2021