IsNumeric 函数极慢
Posted
技术标签:
【中文标题】IsNumeric 函数极慢【英文标题】:IsNumeric function extremly slow 【发布时间】:2014-03-20 11:58:13 【问题描述】:有我从数据库中填充的 gridview,现在我想右对齐 gridview 中的所有数字项,但是如果 IsNumeric(row.Cells(i).Text)
statment 需要很长时间,还有其他方法可以解决这个问题吗?
代码:
以其他方式将数字向右对齐需要很长时间
For Each row As GridViewRow In Me.gwResult.Rows
For i As Integer = 0 To headCell - 1
If IsNumeric(row.Cells(i).Text) Then
row.Cells(i).HorizontalAlign = HorizontalAlign.Right
End If
Next
Next
【问题讨论】:
您是否针对列的数据类型尝试了特定的 TryParse? 您应该知道表中(在数据库中)列的类型。你为什么要使用IsNumeric()
来解决你已经知道的事情?
@dav1dsm1th 是正确的,除非此列包含混合值(一些字符串和一些数字)。请解释
首先,我无法访问每一列,这就是我这样做的原因,其次,gridview 是动态的,因此有时会有更多的“列”是数字的。跨度>
您是将 GridView 绑定到通用列表还是数据表?
【参考方案1】:
您在绑定DataSource
后使用此代码来识别数值,这将增加额外的时间来分析网格数据。尝试在 gridview 的 RowDataBound
事件上使用相同的代码。
【讨论】:
为什么会更快?? 因为对于所有行,RowDataBound
将被执行(如果存在)。然后您可以在绑定时检查每个行调用的值。在您的情况下,网格是绑定的,然后循环遍历每一行和每个单元格以分析值。
但我的问题是,例如,第 0 列是字符串,第 1 列是数字,第 2 列是字符串,所以我不能将一行作为数字然后我宁愿使用列,但我还没有弄清楚如何修复 gridview 给你的列。
在行数据绑定事件中,您也可以访问每个单元格及其值。 msdn.microsoft.com/en-us/library/…【参考方案2】:
您最好的选择是在将网格绑定到数据源之前找出哪些列是数字的。在GridView
的RowDataBound
事件中,您可以检查当前正在数据绑定的列是否在numericColumns
集合中。
'Find numeric properties of the type beehing databound
Dim numericColumns = New HashSet(GetType(MyDataType).GetProperties() _
.Where(Function(x) IsNumericType(x.PropertyType)))
.Select(Function(x) x.Name))
'And for DataTable it would look like this
Dim numericColumns = New HashSet(dt.Columns.Cast(Of DataColumn)() _
.Where(Function(x) IsNumericType(x.DataType))) _
.Select(Function(x) x.ColumnName))
Private Shared Function IsNumericType(dataType As Type) As Boolean
Dim code = CInt(Type.GetTypeCode(dataType ))
Return code >= 4 AndAlso code <= 15
End Function
【讨论】:
以上是关于IsNumeric 函数极慢的主要内容,如果未能解决你的问题,请参考以下文章
从数据类型 varchar 转换为 numeric 时出错.