q406157290 发表于 2017-5-17 08:59:02

Alice 发表于 2017-5-16 17:55
这个事件不建议用来取编辑的值,原因之前已经解释过了。
如果是有需求需要建议,我可以给你提供些合理的 ...

为什么使用selectItem也会出现null异常
这难道不是bug吗?
怎么总是推托我们使用不当呢

Alice 发表于 2017-5-17 15:14:54

q406157290 发表于 2017-5-17 08:59
为什么使用selectItem也会出现null异常
这难道不是bug吗?
怎么总是推托我们使用不当呢

changing方法的设计是为了在选中区域发生变化的时候让用户知道我们要remove哪些,要添加哪些到新的range里面。并不能取到编辑的行。
我们有提供其他的方法去获取编辑状态的行,比如你可以在BeganEdit 这个方法里面拿到row和column信息,而不是changing方法。

q406157290 发表于 2017-5-18 09:00:23

Alice 发表于 2017-5-17 15:14
changing方法的设计是为了在选中区域发生变化的时候让用户知道我们要remove哪些,要添加哪些到新的range ...

您提供给我们的方法并不符合我的逻辑需求
前面有提到已经不在changing里面去处理这些逻辑了
拿到changed里去处理了,但有时候会出NullException 还是无限出

Alice 发表于 2017-5-18 15:29:52

本帖最后由 Alice 于 2017-5-18 16:03 编辑

q406157290 发表于 2017-5-18 09:00
您提供给我们的方法并不符合我的逻辑需求
前面有提到已经不在changing里面去处理这些逻辑了
拿到change ...
谢谢您的反馈的信息。
为了避免您使用中出现问题,您可以参考如下事件的处理逻辑,您可以根据这些信息处理自己的逻辑,以避免之前提到的情况。

var editItem = dataGrid.Rows.FirstOrDefault(m => m != null && m.IsEditing);这句代码,是一句会遍历所有行的代码。它会循环遍历datagrid的所有行。
假设您有300行,它就会遍历300行。
数据绑定的时候页面显示的数据不一定是300行,它隐藏掉不能显示出来的数据,根据界面的大小,也许它只有12行。
而过滤也是一个遍历的的操作,它会遍历并按照所有的条件去做清除操作,以便显示合适的内容。

也就是说初始的时候记录的显示数据是12行。

当没有if条件这句语句的时候,双击单元格会触发SelectionChanings事件,因为没有判断条件所以直接就对Rows的所有对象做了遍历,这时候就会将所有遍历的行(假设是300行做对象的记录)
在复制粘贴完成做过滤的时候,会遍历清除掉刚才300行的记录,清除的时候会先触发SelectionjChanging事件通知用户我们要清除哪些,然后就会进入到您那段代码逻辑(Changing)中。
做遍历的时候依然是刚才的300条数据,所以就按照逻辑进行下去。


当有if条件的时候,双击单元格会触发SelectionChanging事件,但是有if语句,因此不会进入到if语句执行遍历取行的操作。
在复制粘贴完成做过滤的时候,这个时候进入到SelectionChanging事件中,if条件是满足的,就会执行这句代码
var editItem = dataGrid.Rows.FirstOrDefault(m => m != null && m.IsEditing);
它做了遍历并到了changed事件,最后删除掉当前的item。在遍历的过程中实际上它将12行数据修改成了300行数据。
在C#中是不允许运行遍历的时候对集合的数量进行修改的,因此就会出现这个错误。

所以无论changing/changed都是一样的道理。
以上的内容提供给您,给您作为处理逻辑的参考。



q406157290 发表于 2017-7-5 15:16:03

Alice 发表于 2017-5-18 15:29
谢谢您的反馈的信息。
为了避免您使用中出现问题,您可以参考如下事件的处理逻辑,您可以根据这些信息处 ...
en hao 辛苦了

JeffryLI 发表于 2017-7-5 16:56:35

q406157290 发表于 2017-7-5 15:16
en hao 辛苦了

{:4_86:}
页: 1 2 [3]
查看完整版本: C1DataGrid 的大bug 急急急!!!!