lrjnew 发表于 2014-8-7 10:06:00

【WinForms】关于自动增加行

在Spread的CellChanged事件中加入判断,CellChanged事件触发的时候,若是表格的第一列,并且是最后一行(即最后一行的第一个单元格),就使用Rows.Add(Me.FpSpread1_Sheet1.Rows.Count, 1),在最后增加一行,实现了自动增加行的功能。

正常情况下,我从EXCEL中复制多行的数据粘贴上去,也会实现自动逐一增加。

但是,因为我的表格有几列是隐藏了的,在窗体加载的时候我加入了InputMap的自定义按键操作:im.Put(New FarPoint.Win.Spread.Keystroke(Keys.V, Keys.Control), FarPoint.Win.Spread.SpreadActions.ClipboardPasteAsStringSkipHidden),粘贴的时候跳过隐藏的列,然后我从EXCEL中复制多行的数据粘贴上去就变得不正常了,只能自动新增表格原有的行数(若表格只有一行就会新增一行,若表格原来有N行,就会逐一自动增加N行,如果复制的行数比N多,多出来的行没有自动增加,触发不了CellChanged事件),请帮忙解决,谢谢!

iceman 发表于 2014-8-7 19:10:00

回复 1楼lrjnew的帖子

你好,
感谢你的问题反馈,为了便于调查问题,能否把你的Demo发上来我们进行调试?

lrjnew 发表于 2014-8-12 16:54:00

其实就是以下的CellChanged事件,如果表格里没有隐藏的列就能正常的自动一行一行的增加,如果有隐藏的列,那就只能增加表格中原本已经有的行的数量

Private Sub FpSpread1_Sheet1_CellChanged(ByVal sender As Object, ByVal e As   FarPoint.Win.Spread.SheetViewEventArgs) Handles FpSpread1_Sheet1.CellChanged
      If e.Column = 0 Then
            Dim TxtStr As String = Me.FpSpread1_Sheet1.Cells(e.Row, e.Column).Text
            If TxtStr <> "" AndAlso e.Row = Me.FpSpread1_Sheet1.Rows.Count - 1 Then
                Me.FpSpread1_Sheet1.Rows.Add(Me.FpSpread1_Sheet1.Rows.Count, 1)
            End If
      End If
    End Sub

还有窗体初始化的时候加了自定义按键操作

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim im As New FarPoint.Win.Spread.InputMap
      im = Me.FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused)
      im.Put(New FarPoint.Win.Spread.Keystroke(Keys.C, Keys.Control),FarPoint.Win.Spread.SpreadActions.ClipboardCopyAsStringSkipHidden)
      im.Put(New FarPoint.Win.Spread.Keystroke(Keys.V, Keys.Control),FarPoint.Win.Spread.SpreadActions.ClipboardPasteAsStringSkipHidden)
      im = Me.FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused)
      im.Put(New FarPoint.Win.Spread.Keystroke(Keys.C, Keys.Control),FarPoint.Win.Spread.SpreadActions.ClipboardCopyAsStringSkipHidden)
      im.Put(New FarPoint.Win.Spread.Keystroke(Keys.V, Keys.Control),FarPoint.Win.Spread.SpreadActions.ClipboardPasteAsStringSkipHidden)
End Sub

iceman 发表于 2014-8-12 17:36:00

回复 3楼lrjnew的帖子

感谢你提供的代码,我会尝试重现这个问题并给你反馈。

lrjnew 发表于 2014-8-14 09:12:00

回复 4楼iceman的帖子

请问问题解决了吗?有什么办法可以处理呢?

iceman 发表于 2014-8-14 09:58:00

回复 5楼lrjnew的帖子

你好,

使用 Spread 7.0V4 没能重现你的问题,我的测试用例如下:
1.粘贴一行
2.粘贴多行
3.粘贴行数大于当前 Sheet 行数。
详细操作现象请参考视频:



测试demo(VS2013 + .NET 4.0 + C#+ Spread 7.0V4 ),看你那边是否能重现问题:


最大可能是我们之间的 Spread 版本有区别。
请对比我们操作或产品版本之间的不同,并把结果反馈给我们。

谢谢

lrjnew 发表于 2014-8-14 14:25:00

回复 6楼iceman的帖子

我用的是win form 5.0版本的.我觉得不是版本的区别.你的版本也出现这个问题,只是你没注意.
你再回看一下你的视频就知道了,你第二次复制的是15行数据,但是粘贴进去的只有11行,那是因为你粘贴前,表格只有11行,所以即使你复制了15行数据,最终也是成功触发了11行数据进去。

你试一下在表格初始化的时候,设置RowCount=1,然后直接复制多行粘贴进去看看就会看得明显一点了.

iceman 发表于 2014-8-14 17:22:00

回复 7楼lrjnew的帖子

是的,是我误看了,正在想办法看能否获取剪切板中的行数之后事先添加相应行来解决这个问题。关于 ClipBoard 的操作您也可以尝试实现下。

lrjnew 发表于 2014-8-19 15:13:00

回复 8楼iceman的帖子

感觉用ClipBoard不是很合理,ClipBoard好像是正常工作的,只是SheetView接收有点问题,如果SheetView中原来的行数比要粘贴的行数少,就会出现多出来的数据没有触发CellChanged事件,只有增加了以下按键事件才会有这种情况出现:
im.Put(New FarPoint.Win.Spread.Keystroke(Keys.V, Keys.Control),FarPoint.Win.Spread.SpreadActions.ClipboardPasteAsStringSkipHidden)

不知道有没有处理ClipboardPasteAsStringSkipHidden的办法呢?

lrjnew 发表于 2014-8-19 15:43:00

回复 8楼iceman的帖子

先用Clipboard解决了,估计是逻辑问题
Private Sub FpSpread1_ClipboardPasting(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ClipboardPastingEventArgs) Handles FpSpread1.ClipboardPasting
      Dim StrArr As String() = My.Computer.Clipboard.GetText().Split(Chr(10))
      If Me.FpSpread1_Sheet1.RowCount &lt; StrArr.Length Then
            Me.FpSpread1_Sheet1.RowCount = StrArr.Length
      End If
    End Sub

我猜是因为我设置了ClipboardPasteAsStringSkipHidden,所以如果SheetView中原来的行比复制的数据行少,在粘贴的时候,FpSpread就认为其他的行是隐藏的,然后跳过,就只能粘贴一部分数据,触发不到CellChanged事件了
页: [1] 2
查看完整版本: 【WinForms】关于自动增加行