C1FlexGrid在Win10下的Bug
本帖最后由 s5689412 于 2019-6-11 08:57 编辑C1FlexGrid的自定义编辑器里面有CheckListEditor,在Win10下面无法选中CheckList的项目,具体表现是选中CheckList中的项目,点击CheckList控件之外的地方,让CheckList控件失去焦点之后选中的项目没有被设置到C1FlexGrid的单元格中。
可以下载这个Demo,运行之后选择 单元格类型->自定义编辑器->选择Flags行 测试 感谢反馈问题,这个demo我需要查一下源码看看错误的原因,周一给你反馈 请问这个问题有什么进展吗? 本帖最后由 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;
}
我试着用一个比较绕的办法解决了这个问题,但是有时会卡死,不知道官方有没有更好的解决办法? C1EditorGetValue是IC1EmbeddedEditor接口的方法之一,这些方法都是通过反射来进行调用 的,看起来似乎和Win10下反射性能提高有关系?但是为什么用其他控件(比如下面的多列控件)就没有这个问题,很是奇怪 问题确实比较诡异,如果是选择选项后,点击其他的控件让grid失去焦点,就可以保存选项,反之不行,这个问题我需要提交给我们的产品组来确定原因,然后给你答复
再次感谢反馈bug Richard.Ma 发表于 2019-6-10 23:36
问题确实比较诡异,如果是选择选项后,点击其他的控件让grid失去焦点,就可以保存选项,反之不行,这个问题 ...
请问这个问题有什么进展吗? 本帖最后由 Richard.Ma 于 2020-5-28 11:04 编辑
已经将问题提交的产品部门了,Bug 438258 但是还未收到验证结果,我再帮你问下进度如何 本帖最后由 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,操作更方便哦
另外,我上传到自己修改的代码,以下截图为修改的位置,有兴趣的朋友可以自己测试下。
我自己感觉这个解决办法不怎么样,代码逻辑变得更复杂是一方面,另一方面是还需要处理FlexGrid的事件,如果AfterEdit中有相关逻辑的话说不定会有副作用,希望官方或者其他高手能给出更好的解决方法。:)
页:
[1]
2