Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 截断尾随零datagridview列_.net_Sql Server_Vb.net_Datagridview_Formatting - Fatal编程技术网

.net 截断尾随零datagridview列

.net 截断尾随零datagridview列,.net,sql-server,vb.net,datagridview,formatting,.net,Sql Server,Vb.net,Datagridview,Formatting,我使用windows datagridview从SQL中的order items表访问数据 在SQL中,我将项目的价格存储为小数18,4 在datagridview上,我最初在小数点18,4上使用了C4格式字符串 这很好,但它在价格上显示了额外的零,例如,如果价格是18.12英镑,它将显示为18.1200英镑,但如果价格是18.1234英镑,那么我希望看到18.1234英镑。一个重要的注意事项是,我希望标志是特定于文化的。因为我住在英国,如果一个美国用户使用这个系统,它需要$etc 我解决这个问

我使用windows datagridview从SQL中的order items表访问数据

在SQL中,我将项目的价格存储为小数18,4

在datagridview上,我最初在小数点18,4上使用了C4格式字符串

这很好,但它在价格上显示了额外的零,例如,如果价格是18.12英镑,它将显示为18.1200英镑,但如果价格是18.1234英镑,那么我希望看到18.1234英镑。一个重要的注意事项是,我希望标志是特定于文化的。因为我住在英国,如果一个美国用户使用这个系统,它需要$etc

我解决这个问题的方法是像这样处理datagridview上的单元格格式化事件

    Private Sub gridOrderItems_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles gridOrderItems.CellFormatting
    If Me.gridOrderItems.Rows.Count > 0 Then
    Dim dr As DataGridViewRow = Me.gridOrderItems.Rows(e.RowIndex)
    If e.ColumnIndex = Me.gridOrderItems.Columns("priceColumn").Index Then
    e.Value = USEFUL.RemoveTrailingZerosForCurrency(e.Value)
    End If
    End If
    End Sub


    Public Shared Function RemoveTrailingZerosForCurrency(ByVal d As Decimal) As String
    Dim s As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
    Return d.ToString(s & "0.00###########################")
    End Function
不过,在绘制大型数据网格时,我开始遇到性能问题。我正忙于阅读Microsoft最佳实践

我试图看看是否有一种标准的方法,可以只使用一个标准的DataGridViewCellStyle格式字符串。我打算创建一个变量来保存单元格样式并对其应用格式

我可以使用0.00,但不包括特定于文化的货币符号,如:,$等

我希望我已经解释清楚了

快速概述 如果价格是18.1234英镑,我想看看18.1234英镑 如果价格是18.1230英镑,我希望看到18.1230英镑的原价。 如果价格是18.1200英镑,我想看看18.12英镑 如果价格是18.0000英镑,我想看到18.00英镑

最重要的是,我希望文化符号是特定于文化的

我曾考虑将SQL数据类型更改为money,但如果在我们的报告系统上不能将小数18,4合并为money,我可能会陷入一大堆SQL Cast噩梦

任何想法或建议都会有帮助,提前谢谢

大卫。

你可以试试:

Public Shared Function RemoveTrailingZerosForCurrency(ByVal d As Decimal) As String
    Return d.ToString("C4").Replace("00", "")
End Function

因为如果不指定区域性,ToString将使用。

我最终在表单中创建了默认单元格样式变量,并为需要相同类型的多个列指定了样式。我相信这应该会加快表现

在表单顶部声明一个易于使用的符号

Private symbol As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
然后尽可能早地调用它,您可以在表单加载中执行,但我正在调查在网格实际绘制之前是否有更早更好的时间

blackDefaultCellStyle = New DataGridViewCellStyle
blackDefaultCellStyle = Me.gridOrderItems.DefaultCellStyle.Clone()
blackDefaultCellStyle.Format = symbol & "0.00###########################"
现在我只需将列指定给单元格样式,如下所示:

Me.gridOrderItems.Columns("DailypriceDataGridViewTextBoxColumn").DefaultCellStyle =  blackDefaultCellStyle

你试过d.ToStringC4,New System.Globalization.cultureInfo-GB吗?我会试一下,我担心18.0000仍然是18.0000,通过查看代码,这是否意味着没有真正的格式字符串可以做到这一点,而不需要像我已经做的那样手动截取CellFormattingEvent?这比我的稍微好一点。我在想,如果我调暗DataGridViewCellStyle类型的变量,然后设置d.ToStringC4.Replace00的格式,然后将其应用于相关列,可能会提高性能,因为我不会干扰单元格格式化事件中的每个单元格样式。我担心您提出的这个解决方案可能会将1800.4500替换为18.45。谢谢。这不会带来用12.34替换12.0034的风险吗?