首页 > 解决方案 > 格式化的单元格值不等于单元格值,即使是因为格式化

问题描述

我正在使用具有此格式属性的列的 DataGridViewdataGridView1.Columns["RABAT"].DefaultCellStyle.Format = "0\\%";

因此,当我进入单元格并退出它时,我的dataGridView1_CellValidating事件就会启动。在那里我有一个简单的检查,我检查该单元格的旧值是否等于新值,如果是,则不要继续执行代码,它看起来像这样

if (dataGridView1.SelectedCells[0].Value == e.FormattedValue)
    return;

现在的问题是,由于我返回的格式属性,dataGridView1.SelectedCells[0].Value但是10e.FormattedValue我返回10%时它通过了此检查,因为这两个值不相同。

我能做的(并且知道该怎么做)是删除除数字之外的所有内容e.FormattedValue,然后进行比较,因为在这种情况下,此列中只有整数,但对于未来的代码,我如何从中删除格式样式e.FormattedValue

我已经这样做了,但这是暂时的,因为我有很多列并且不想每次都创建其他方法来摆脱格式。

switch (dataGridView1.Columns[e.ColumnIndex].Name)
{
    case "KOLICINA":

        if (dataGridView1.SelectedCells[0].Value == e.FormattedValue)
            return;

        dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value = e.FormattedValue;
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNAVREDNOSTSAPOPUSTOM"].Value = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value) * Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENASAPOPUSTOM"].Value);
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNAVREDNOST"].Value = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value) * Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENA"].Value);
        PresaberiStavku(dataGridView1.Rows[e.RowIndex], false);
        break;
    case "RABAT":

        if (Convert.ToDouble(dataGridView1.SelectedCells[0].Value) == Convert.ToDouble(M.String.LeaveOnlyNumbers(e.FormattedValue.ToString())))
            return;

        double r = Convert.ToDouble(M.String.LeaveOnlyNumbers(e.FormattedValue.ToString()));
        double k = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value);
        double pc = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENA"].Value);
        double pcsp = pc - (pc * r / 100);
        double pvsp = pcsp * k;

        dataGridView1.Rows[e.RowIndex].Cells["RABAT"].Value = r;
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENASAPOPUSTOM"].Value = pcsp;
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNAVREDNOSTSAPOPUSTOM"].Value = pvsp;

        PresaberiStavku(dataGridView1.Rows[e.RowIndex], false);
        break;
}

标签: c#winformsdatagridview

解决方案


在具有格式的单元格中输入数据时,您应该考虑以下事实:

  • 单元格的值保持不变,格式化是为了显示目的。
  • 在单元格中输入数据时,您应该输入不带任何格式的数据,例如具有0%as Format,如果键入50%为值,则它无效,但50有效并且将显示为50%
  • 输入数据时,如果不更改单元格中的任何内容,则DataGridView.IsCurrentCellDirty返回false,否则返回true
  • e.FormattedValue始终包含单元格中显示的文本。

了解了以上事实,我相信您有足够的信息来完成您正在尝试做的事情。

例如,知道单元格不脏,您可以返回。否则,您需要检查是否e.FormattedValue可以转换为ValueType列。请记住,键入50%会使单元格变脏的情况是无效数据。


推荐阅读