s5689412 发表于 2019-6-8 17:22:42

C1FlexGrid在Win10下的Bug

本帖最后由 s5689412 于 2019-6-11 08:57 编辑

C1FlexGrid的自定义编辑器里面有CheckListEditor,在Win10下面无法选中CheckList的项目,具体表现是选中CheckList中的项目,点击CheckList控件之外的地方,让CheckList控件失去焦点之后选中的项目没有被设置到C1FlexGrid的单元格中。




可以下载这个Demo,运行之后选择 单元格类型->自定义编辑器->选择Flags行 测试

Richard.Ma 发表于 2019-6-9 20:39:16

感谢反馈问题,这个demo我需要查一下源码看看错误的原因,周一给你反馈

s5689412 发表于 2019-6-10 16:19:08

请问这个问题有什么进展吗?

s5689412 发表于 2019-6-10 18:00:38

本帖最后由 s5689412 于 2019-6-10 21:37 编辑

我跟踪的结果是Demo代码本身没有问题,但是看起来似乎像是Win10系统下FlexGrid的FinishEditing触发的更快,导致下面的代码执行的时候_value的内容还没有构造完成。

                public object C1EditorGetValue()
                {
                        // return value from drop down or from edit area
                        return (_dropped)? _value: Text;
                }

我试着用一个比较绕的办法解决了这个问题,但是有时会卡死,不知道官方有没有更好的解决办法?

s5689412 发表于 2019-6-10 21:36:42

C1EditorGetValue是IC1EmbeddedEditor接口的方法之一,这些方法都是通过反射来进行调用 的,看起来似乎和Win10下反射性能提高有关系?但是为什么用其他控件(比如下面的多列控件)就没有这个问题,很是奇怪

Richard.Ma 发表于 2019-6-10 23:36:52

问题确实比较诡异,如果是选择选项后,点击其他的控件让grid失去焦点,就可以保存选项,反之不行,这个问题我需要提交给我们的产品组来确定原因,然后给你答复

再次感谢反馈bug

s5689412 发表于 2019-6-14 20:27:22

Richard.Ma 发表于 2019-6-10 23:36
问题确实比较诡异,如果是选择选项后,点击其他的控件让grid失去焦点,就可以保存选项,反之不行,这个问题 ...

请问这个问题有什么进展吗?

Richard.Ma 发表于 2019-6-17 12:32:21

本帖最后由 Richard.Ma 于 2020-5-28 11:04 编辑

已经将问题提交的产品部门了,Bug 438258 但是还未收到验证结果,我再帮你问下进度如何

s5689412 发表于 2019-6-22 10:35:45

本帖最后由 s5689412 于 2019-6-22 13:36 编辑

额,不知道产品组那边什么时候才能有结果,我先说说自己的解决方法吧,有点曲线救国的意思,大概不算是最好的解决办法,放在这儿权当抛砖引玉吧。

现在的问题在于Demo代码在CheckList框收起之后,不知为什么C1EditorGetValue被极快触发,导致_value变量还没有构造出新值,返回的是之前的值
      public object C1EditorGetValue()
      {
            // return value from drop down or from edit area
            return (_dropped) ? _value : Text;
      }

所以我的解决思路是既然没办法在C1EditorGetValue事件之前的某个事件中赋新值,那就时刻保持取到的值最新,因为C1EditorGetValue毕竟要在while循环后才会触发

            // wait until user makes a selection
            while (control.Visible)
            {
                Application.DoEvents();
                MsgWaitForMultipleObjects(1, IntPtr.Zero, 0, 5, 255);
            }

我处理了CheckedListBox的_list_ItemCheck事件,每当有项目发生变化时,就更新内容字符串。
按照以上思路处理完之后,在实测过程中发现有一定概率会有卡死情况出现,怀疑是在control.Visible的判断上出了问题,导致进入死循环,为了解决这个问题,
我又增加了isAfterEdit变量,确保在单元格编辑完成之后会跳出循环,最终实测效果很不错。

Demo程序因为较大,我上传到百度网盘,可以下载查看
链接:https://pan.baidu.com/s/1MIyx6GNuuGq7BVSdXsuOsQ
提取码:mh9j
复制这段内容后打开百度网盘手机App,操作更方便哦

另外,我上传到自己修改的代码,以下截图为修改的位置,有兴趣的朋友可以自己测试下。






s5689412 发表于 2019-6-22 13:35:28

我自己感觉这个解决办法不怎么样,代码逻辑变得更复杂是一方面,另一方面是还需要处理FlexGrid的事件,如果AfterEdit中有相关逻辑的话说不定会有副作用,希望官方或者其他高手能给出更好的解决方法。:)
页: [1] 2
查看完整版本: C1FlexGrid在Win10下的Bug