c# - 格式化的单元格值不等于单元格值,即使是因为格式化
问题描述
我正在使用具有此格式属性的列的 DataGridViewdataGridView1.Columns["RABAT"].DefaultCellStyle.Format = "0\\%";
因此,当我进入单元格并退出它时,我的dataGridView1_CellValidating
事件就会启动。在那里我有一个简单的检查,我检查该单元格的旧值是否等于新值,如果是,则不要继续执行代码,它看起来像这样
if (dataGridView1.SelectedCells[0].Value == e.FormattedValue)
return;
现在的问题是,由于我返回的格式属性,dataGridView1.SelectedCells[0].Value
但是10
当e.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;
}
解决方案
在具有格式的单元格中输入数据时,您应该考虑以下事实:
- 单元格的值保持不变,格式化是为了显示目的。
- 在单元格中输入数据时,您应该输入不带任何格式的数据,例如具有
0%
asFormat
,如果键入50%
为值,则它无效,但50
有效并且将显示为50%
。 - 输入数据时,如果不更改单元格中的任何内容,则
DataGridView.IsCurrentCellDirty
返回false
,否则返回true
。 e.FormattedValue
始终包含单元格中显示的文本。
了解了以上事实,我相信您有足够的信息来完成您正在尝试做的事情。
例如,知道单元格不脏,您可以返回。否则,您需要检查是否e.FormattedValue
可以转换为ValueType
列。请记住,键入50%
会使单元格变脏的情况是无效数据。
推荐阅读
- php - 在 php 中使用 ajax 从数据库中获取数据时,操作链接不起作用
- git - TFS GIT - 从大师那里获取最新信息
- sql - CTE 必要或多个连接
- python - 使用函数创建和编辑不同的变量
- flutter - Flutter,我正在使用 local_auth 0.6.3+2 进行 Touch ID、Face ID 身份验证。但找不到如何打开输入密码按钮
- django - Django REST Framework 基于类的视图继承
- reactjs - 在 JSX 中嵌套 If 语句
- reactjs - 使用 cypress 测试 Echarts 反应组件
- javascript - 如何对表格的行进行分组(按“数量”单元格)?
- html - 如何将导航与标题对齐