找回密码
 立即注册

QQ登录

只需一步,快速开始

darkelf
论坛元老   /  发表于:2013-7-30 09:14  /   查看:14082  /  回复:17
将datasource绑定到sheetview问题。
现在是从VB6的Spread3还是4转到VB.NET的Spread7,然后在数据绑定时出现问题。

1.直接将datasource绑定到Sheetview的时候,sheetview的最大行,列都变成绑定数据的项目数和行数。
这造成放在隐藏行的SheetView格式被清除。

2.如果用区域绑定方式,在例程测试中,执行速度很快,但是代码正式使用时,同样的数据量,花费时间却要1分钟前后。
代码如下,就是在Spread帮助里的内容,然后参考论坛上区域绑定相关资料后写的代码。

fpSp.SuspendLayout()
Dim data As New FarPoint.Win.Spread.Data.SpreadDataBindingAdapter
Dim ds As DataSet = Adodc2.DataSource    'Adodc中保存的DataSource是DataSet类型。
data.DataSource = ds.Tables(0)             ' 必须是DataTable类型对吗?
data.Spread = fpSp
data.SheetName = fpSp.ActiveSheet.SheetName
data.MapperInfo = New FarPoint.Win.Spread.Data.MapperInfo(0, 0, ds.Tables(0).Rows.Count - 1, ds.Tables(0).Columns.Count - 1)
data.FillSpreadDataByDataSource()
fpSp.ResumeLayout()

如果代码方面没有错误,那么可能是什么情况造成运算速度非常慢呢?

17 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-7-30 09:25:00
沙发
回复 1楼darkelf的帖子

你好,

感谢问题反馈。
1.SheetView 设置 DataSource 属性后所有格式信息都会清除。可以考虑在绑定数据后设置隐藏行。
2.data.DataSource 可以指定为 DataSet ,再指定 data.DataMember 属性为 table 名称。
可以 Debug 看时间消耗在哪行代码。

谢谢
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-7-30 09:36:00
板凳
消耗时间在最后的data.FillSpreadDataByDataSource()。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-7-30 09:55:00
地板
回复 3楼darkelf的帖子

能从项目中提取个例子发上来查看吗?我这边根据目前信息无法重现问题。谢谢
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-7-30 10:18:00
5#
我将测试程序中读取文件,设置格式,复制格式,数据绑定这部分代码集中处理了一下放在下面。
  1. With fpsp
  2.         ' load file
  3.         .LoadFromFile("SampleSheet.ss7")
  4.         .BlockMode = True
  5.         .MaxCols = 113
  6.         .MaxRows = 2996
  7.         .Col = 1
  8.         .Row = 2996
  9.         .Col2 = 113
  10.         .Row2 = 2996
  11.         ' VB6InterFace是项目中针对VB6的旧版Spread制作的接口。 属性名与旧版Spread一致,内容通过Spread7实现。
  12.         .CellType = VB6InterFace.CellTypeConstants.CellTypeNumber   `是列举型,根据 Typeof Cell.CellType is 新版CellType做内部分离
  13.         .TypeTextOrient = VB6InterFace.TypeTextOrientConstants.TypeTextOrientHorizontal
  14.         .TypeNumberShowSep = True
  15.         .TypeNegRed = True
  16.         .TypeNumberDecPlaces = 0
  17.         .TypeNumberSeparator = ","
  18.         For i As Integer = 1 To 113
  19.                 .Col = i
  20.                 .Row = 2996
  21.                 .Col2 = i
  22.                 .Row2 = 2996
  23.                
  24.                 Select Case i
  25.                         Case 1, 2, 3, 4, 5, 6, 7
  26.                                 .CellType = VB6InterFace.CellTypeConstants.CellTypeEdit
  27.                                 .TypeTextOrient = VB6InterFace.TypeTextOrientConstants.TypeTextOrientHorizontal
  28.                                 .TypeNegRed = True
  29.                                 .TypePercentDecPlaces = 1
  30.                         Case 11, 16, 21, 25, 29, 33, 37, 41, 45, 50, 55, 60, 65, 70, 75
  31.                                 .CellType = VB6InterFace.CellTypeConstants.CellTypePercent
  32.                                 .TypeTextOrient = VB6InterFace.TypeTextOrientConstants.TypeTextOrientHorizontal
  33.                                 .TypeNegRed = True
  34.                                 .TypePercentDecPlaces = 1
  35.                 End Select
  36.         Next i
  37.         .BlockMode = False
  38.         .Row = 1
  39.         .Col = 1
  40.        ` 将定义好的类型复制到第一行开始的位置。数量为取得Data的件数
  41.         For i As Integer = 1 To 81
  42.                 .CopyRowRange(2996, 2996, i)
  43.         Next
  44.         'End If
  45.         .ActiveSheet.DataAutoCellTypes = False
  46.         Dim strBf1 As String = GetSqlStr()
  47.         Dim cn As New xxxAdodc.Connection
  48.         cn.Open("Provider=SQLOLEDB.1;Data Source=database1;Persist Security Info=True;Password=1234;User ID=5678;Initial Catalog=testDb")
  49.         `取得数据并保存在Adodc1中
  50.         Dim da1 As OleDb.OleDbDataAdapter
  51.         Dim ds1 As DataSet = New DataSet("Bs1")
  52.         da1 = New OleDb.OleDbDataAdapter(strBf1, cn.conObj)
  53.         da1.Fill(ds1, "Bs1")
  54.         Me.Adodc1.DataSource = ds1
  55.         Me.Adodc1.DataMember = "Bs1"
  56.         `区域绑定
  57.         Dim data As FarPoint.Win.Spread.Data.SpreadDataBindingAdapter = New FarPoint.Win.Spread.Data.SpreadDataBindingAdapter()
  58.         Dim ds As DataSet = Adodc1.DataSource
  59.         data.DataSource = ds.Tables(0)
  60.         data.Spread = fpsp
  61.         data.SheetName = fpsp.ActiveSheet.SheetName
  62.         data.DataAutoCellTypes = False
  63.         data.MapperInfo = New FarPoint.Win.Spread.Data.MapperInfo(0, 0, ds.Tables(0).Rows.Count - 1, ds.Tables(0).Columns.Count - 1)
  64.         data.FillSpreadDataByDataSource()                ' 执行相对很慢,大约5~10秒, 在实际项目中,这个部分则是55秒
  65. End With
复制代码
回复 使用道具 举报
gaoge00
论坛元老   /  发表于:2013-7-30 11:08:00
6#
回复 5楼darkelf的帖子

可以将隐藏列自己添加到DataTable中,然后再绑定到Spread中
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-7-30 12:07:00
7#
回复 5楼darkelf的帖子

很抱歉,上面代码我无法使用。
现在使用的版本是 Spread Studio for Winform 7.0 吗?
.MaxCols 和    .MaxRows 都是 Spread COM 版的属性。

不能重现问题,无法进行进一步调查,能发发送可执行 Demo 到论坛?
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-7-30 12:59:00
8#
抱歉,我没有说清楚。
旧版本的Spread利用了MaxCols和MaxRows,于是在新版本Spread 7 for WindowsForm中,做了一个接口dll,直接用旧的属性名,
利用Spread7Form的方法来实现旧功能。
比如
MaxRows属性,就利用FarPoint.Win.Spread.FPSpread.ActiveSheet.RowCount

尽量降低程序修改难度和工作量。
可执行demo有,但是不方便发送到论坛。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-7-30 13:16:00
9#
回复 8楼darkelf的帖子

可以发送到我的邮箱里,已经通过论坛短消息发送给你。
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-7-31 08:17:00
10#
你好。 关于区域绑定的问题,我找到了另外一种方法来处理列部分的设置,但是行依旧无法保存原始文件的设置。

SS7文件的最后三行保存着表格的表头等内容,数据绑定后,将表头内容复制并插入到数据头来实现表格的创建。

现在的问题是当Datasource绑定时,利用

  1. FpSpread1.ActiveSheet.AutoGenerateColumns = False
  2. FpSpread1.ActiveSheet.DataSource = Adodc.datasource
复制代码

我可以保持列的原始设置,但是行却没办法保存数据绑定前的原始设置。
例如SS7文件中,3000行开始时表头的内容。
数据库中取得datasource只有100行,此时数据绑定后的表就是
500列(spread默认列)X 100行。 100行以后的行数都被清理掉了,所以表头也无法设置。

请问这个该如何解决?
现在只有想到一个笨办法,临时创建一个tmpsheet,然后在Sheet1的数据绑定前,将Sheet1的表头内容复制到tmpsheet中,
Sheet1数据设置接收后再从tmpsheet取得
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部