在 DataGridView 中使用格式

Using format in DataGridView

我的 DGV 有一些问题,DGV 受至少 30 列的数据表限制(除了 PK 和 FK,都设置为字符串),现在有一个特定的列是产品的成本我想让它像这个示例:359.99 €,每次用户单击该列单元格时,它将显示 nullvalue 0.00 €,货币符号不能在单元格内编辑,点分隔符也是如此。

这就是我的目标,我正在尝试做我在 windows 表格中提到的所有事情,我已经通过代码尝试过,但是它没有做任何事情。最后我应该采取什么样的步骤才能达到预期的效果?

我已经为该专栏尝试了以下代码,但是正如我之前所说,它什么也没做,虽然我在 StarkOverflow 中发现了一个与我类似的问题,但似乎我应该在绑定之前输入这段代码DGV(实际上我没有通过代码绑定它,我想我现在不需要那个),但我认为这是不可能的,因为我需要绑定 DGV 所以我可以编辑它(还有一个未绑定的列,包含行的删除按钮,但我认为这里不重要):

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

提前致谢。

我不确定“为什么”你想将“COST”值存储为 string. Cost 意味着一个数字 decimal 值并且它“应该”存储在数据库中作为decimal 或其他数值,但不是 string. 每次在数字上下文中使用 string 时都会产生更多的工作……就像您当前的情况一样。

此外,如果某些用户键入“Hello”作为“成本”值,这可能会使数据库处于不一致状态。有些东西闻起来有腥味,这似乎实际上是在“制造”问题。

您将“成本”值保存为 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 类型。 table 添加了一些行,使得每一行在每一列中都有“相同”的值。

在设置网格的 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);
}