当DGV Cell被格式化为C2格式时,如何传递值给DGV Cell



我正在努力寻找这个问题的具体答案,因此我自己问了一下…

我有一个DataGridView与列有以下格式应用到它:

DGV.Columns(3).DefaultCellStyle.Format = "C2"

在表单上有一个文本框,用户在其中输入一个数字,然后将该值输入到DGV中的一个单元格中:

For Each dr As DataGridViewRow In DGV.Rows
dr.Cells("ColumnHeader").Value = TextBox.Text
Next

在执行上述代码之前,在TextBox上发生此事件以格式化其值:

Private Sub TextBox_Leave(sender As Object, e As EventArgs) Handles TextBox.Leave
TextBox.Text = FormatCurrency(TextBox.Text)
End Sub

文本框内的文本作为货币正确显示,但是当代码将其放入DGV的单元格中执行时,它失败了,说值的格式不正确。

DGV.Columns(3).DefaultCellStyle.Format = "C2"FormatCurrency(TextBox.Text)格式不同吗?

这都是错的。"C2"是一个数字格式字符串,因此它只对数字有效。包含数字字符的String不是数字,包含货币文本的String绝对不是数字。您需要从TextBox中获取String,将其与一个数字(可能是货币值的Decimal)协调,然后将该数字加载到网格中。网格将该数字以及所有数据转换为要显示的文本,并将使用格式字符串:

dr.Cells("ColumnHeader").Value = CDec(TextBox.Text)

至此,您可能已经验证了用户输入,因此不存在CDec抛出异常的可能性。

如果目的是在网格和TextBox中显示格式化为货币的数据,那么您应该摆脱Leave事件处理程序,而处理ValidatingValidated事件。第一个将验证输入以确保它是数字,第二个将执行格式化:

Private Sub TextBox1_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating
If Not Decimal.TryParse(TextBox1.Text, NumberStyles.Currency, Nothing, Nothing) Then
'Don't let the control lose focus when it contains invalid data.
e.Cancel = True
End If
End Sub
Private Sub TextBox1_Validated(sender As Object, e As EventArgs) Handles TextBox1.Validated
TextBox1.Text = Decimal.Parse(TextBox1.Text, NumberStyles.Currency).ToString("C2")
End Sub

该代码将允许用户输入货币符号或不输入货币符号,但一旦失去焦点,它将确保格式是带有两个小数点的货币。然后,您需要在复制到网格时允许格式化:

dr.Cells("ColumnHeader").Value = Decimal.Parse(TextBox1.Text, NumberStyles.Currency)

相关内容

  • 没有找到相关文章

最新更新