找回密码
 立即注册

QQ登录

只需一步,快速开始

yangsq

银牌会员

7

主题

25

帖子

2276

积分

银牌会员

积分
2276

活字格认证

yangsq
银牌会员   /  发表于:2015-2-12 15:56  /   查看:10285  /  回复:11
用下面的代码做成一个简单的表格
Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        ' データだけを貼り付け
        Dim inputmap1 As FarPoint.Win.Spread.InputMap = FpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused)

        inputmap1.Put(New FarPoint.Win.Spread.Keystroke(Keys.V, Keys.Control), FarPoint.Win.Spread.SpreadActions.ClipboardPasteValues)

        Dim inputmap2 As FarPoint.Win.Spread.InputMap = FpSpread1.GetInputMap(InputMapMode.WhenFocused)

        inputmap2.Put(New FarPoint.Win.Spread.Keystroke(Keys.V, Keys.Control), FarPoint.Win.Spread.SpreadActions.ClipboardPasteValues)

        Dim data As New DataTable

        data.Columns.Add("一")
        data.Columns.Add("二")
        data.Columns.Add("")

        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")
        data.Rows.Add("11", "22")

        Me.FpSpread1_Sheet1.DataSource = data

        Dim cmbocell As New FarPoint.Win.Spread.CellType.ComboBoxCellType()
        cmbocell.Items = (New String() {"January", "February", "March", "April", "May", "June"})
        FpSpread1_Sheet1.Columns(2).CellType = cmbocell

    End Sub
其中第三列是ComboBox,先拷贝第一列的几行数据粘贴到第三列上,因为第一列的数据不在第三列的Items中,所以显示空白,但是再
拷贝这几个空白的CELL,粘贴到第二列上,发现是刚才粘贴到第三列的数据,这说明虽然第三列没有显示数据,但实际上里面的value已经
被赋予了Items中不存在的值,现在想要取到跟实际相符合的值的话,又不想去取第三列的cell的text,应该怎么办?或者说有没有什么属性
让ComboBox不接受Items 里没有的值?

11 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-2-12 17:33:00
沙发
回复 1楼yangsq的帖子

这是spread的ComboBox的设计。
只能根据需求去绕这个问题,比如你可以尝试将ComboBox的CellType的Editable设置为false。
或者调用Spread的ClipboardPasted事件,当粘贴的时候会触发此事件。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-2-13 14:28:00
板凳
回复 2楼Alice的帖子

将ComboBox的CellType的Editable设置为false没有用,那只能重写Spread的粘贴了吗?因为是可以范围复制粘贴的,写起来很麻烦,而且容易出bug,没有其他方法了吗?
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-2-13 14:56:00
地板
SPREAD里粘贴复制时,什么Change事件都捕捉不到吗?那如果想要在值发生变更时加一些特殊处理岂不是很麻烦吗?都要在change事件写一遍之后再去粘贴事件里计算粘贴的坐标之后再写一遍?确定这是spread的设计吗?还是有其他方法来做?还是Spread的bug?
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-2-13 15:50:00
5#
Private Sub FpSpread1_ClipboardPasted(sender As System.Object, e As FarPoint.Win.Spread.ClipboardPastedEventArgs) Handles FpSpread1.ClipboardPasted

        Dim range As CellRange = e.CellRange


        For i As Integer = range.Column To range.Column + range.ColumnCount - 1

            If i = 2 Then
                For j As Integer = range.Row To range.Row + range.RowCount - 1
                    If j > Me.FpSpread1_Sheet1.RowCount Then
                        Exit For
                    End If
                    Me.FpSpread1_Sheet1.Cells(j, 2).Value = Me.FpSpread1_Sheet1.Cells(j, 2).Text
                Next
            End If
        Next
    End Sub
对ComboBox暂时先这样处理了,但是粘贴复制不触发change事件我觉得是十分不方便的,而且也没想到有什么理由去设计成这样子。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-2-15 12:05:00
6#
回复 4楼yangsq的帖子

请问你是想获得什么样的Changed事件呢?另外你说的不触发Changed事件,它的具体名称是什么?粘贴的时候会触发粘贴相关的Changed事件,比如Spread的ClipboardPasted事件。

从第一列复制值到第三列,虽然值不在下拉框的范围内,但是值已经赋值给了单元格。如果Editable为true的时候,你可以清楚的看到这个值存在的,Cell.Text/Cell.Value都是可以获取到这个值的。
因此当你从第三列复制,自然就是Cell.Value的值,它不为空。

另外我对微软的标准的ComboBox控件进行了测试,如果你粘贴一个值并不是在它的下拉框里的值,依然可以粘贴到Text上,它并不是不合法的值。本身ComboBox就包含编辑和下拉框选择两种功能。
这点策略spread和微软标准的ComboBox一致。

如果你有的需要必须校验这个粘贴的值,可以通过自己的逻辑代码进行设计。

另外谢谢你反馈的这段代码。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-2-16 08:25:00
7#
回复 6楼Alice的帖子

比如我想在某一列的单元格的值发生变更时,弹出值已变更的提示框(MsgBox),这时候我用的是FpSpread1.Change事件来处理的,但是当我利用ctrl+c,ctrl+v来改变单元格的值时,FpSpread1.Change事件不会被触发,那么就需要单独去粘贴相关的事件里去做,单独做的话,就要判断粘贴板里的值和单元格的是否一致,因为可以范围的复制粘贴,所以处理有点麻烦,因为我刚接触Spread,不知道是不是有更简单的做法?

关于下拉框,有的时候给Spread赋值不是一个一个的单元格赋的,而是用DataSource绑定的,当我想直接利用整个DataTable而并非一个一个单元格的值时,下拉框表示的值跟实际值不一致是非常困扰的。

我觉得Spread这么多人在用,是因为它比微软的控件更好用,更方便,不是跟微软的策略一致就是最好的。

另外,谢谢这么详细和耐心的解答新手级别问题。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-2-16 10:13:00
8#
回复 7楼yangsq的帖子

谢谢你的反馈。
我们总是期望一个万能的事件或是万能的功能,但实际上在任何软件的设计中都不存在的。
Changed事件不是万能的,它是在用户离开编辑状态,提交数据,单元格数据改变的时候触发。它无法区分你是通过右键菜单,或是Ctrl+c/Ctrl+v,还是通过键盘输入。它约束的是编辑状态的中值的变更。

有关下拉框的值和显示的值不一致的问题。下拉框的值是Items,显示的值Value,他们本身就是不同的属性控制的,而且Items的数量也是大于Value的。而且就目前来看很多客户需要设置Value和Items的不一致。比如下面的用例:Value显示文字:“请从下拉框选择:”,然后如果不选的时候就显示Value,选择了就显示选择的值。这是非常常用的场景。

Spread提供了很多功能供用户使用,给用户带来方便,但是它是基于微软的平台,微软本身就提供了很多很好的策略和用户习惯的使用方式,为什么不用呢?

根据你的描述,spread还提供了Validating功能,供用户校验输入。你可以通过很多种方式校验单元格的内容。包含输入和粘贴。具体的你可以参考产品文档的Validating User Input.

另外再次谢谢你的反馈,我们的需求根据全球用户的需求而定。你的反馈是宝贵的意见。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-2-16 10:43:00
9#
回复 8楼Alice的帖子

谢谢耐心的回复,刚接触Spread,还在学习中,很多地方还不是很了解,做过的案也不多,所以可能会问一些比较低级的问题,如您所说,没有万能的控件和功能,但还是希望Spread越来越好,能满足更多的用户需求。

(validating User Input 的文档的链接能给一下吗?没找到。。。)

帖子可以关了
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-2-16 17:30:00
10#
回复 9楼yangsq的帖子

安装产品后,根据操作系统是32位还是64位,可以在如下路径找到产品文档:
C:\Program Files(x86)\ComponentOne\Spread Studio 8\Docs\Windows Forms\FarPoint.Win.Spread.8.0.chm
或是"C:\Program Files\ComponentOne\Spread Studio 8\Docs\Windows Forms\FarPoint.Win.Spread.8.0.chm"
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部