【发布时间】:2018-07-27 04:07:39
【问题描述】:
这是我在这里的第一个问题,请耐心等待。
我在我的软件中遇到了一个错误,即给定控件中的多个单选按钮都能够同时被选中,如此处所示。请注意,这是一个非常大的程序。
Multiple Radio Buttons Selected in One Control
在调试时,我发现此行为的原因是 RadioButton 类的“Checked”属性上的 ReadOnly 属性设置为 true。此外,似乎 RadioButton 上所有属性的 ReadOnly 属性都设置为 True。通过将 ReadOnly 属性的值通过反射更改回 false,我能够确认这是导致意外行为的原因。有趣的是,当这种情况发生时,我的应用程序中的每个单选按钮都会遇到同样的问题。
我能够追踪到属性发生变化的时间点。在另一种形式中,我在属性网格上显示一些对象,当我将该属性网格的 SelectedObject 设置为所有属性都更改时的对象时。带有属性网格的表单和带有单选按钮的表单无论如何都不常见。
一段时间以来,我一直无法找到此问题的根源。如果有人对这如何可能有任何想法,它可能能够帮助我找出问题出在我的程序中。
这是我的调试窗口的图片,显示了在我为属性网格设置 SelectedObject 属性之前和之后的单选按钮上的 ReadOnly 属性值
谢谢。
编辑 1:
这是设置属性网格的代码。第 179 行。在调试时,需要在不同的选项卡中显示 3 个不同的子属性对象。第一个没有问题。第二个。
编辑 2:
解决方案
感谢所有评论的人。在以下线程的帮助下,我实际上能够找出问题的解决方案。
Setting ReadOnly Property in PropertyGrid
基本上,在我的代码中有一个地方,我将对象中所有属性的只读状态设置为 True。似乎有某种通用的“ReadOnly”属性在所有对象之间共享,如果它们没有特殊定义的话。
我最初的解决方案是先检查 ReadOnlyAttribute 是否存在,然后再设置它的值。
但是对于像这样定义的属性,这会返回 True
但是对于这样的属性是 False
我再次猜测是找到了某种继承属性。
因此,我的解决方案是使用以下函数进行检查。
将此检查放入我的 SetReadOnly() 函数解决了我的问题。
【问题讨论】:
-
这些控件是在设计时还是运行时添加的?你能显示一些代码吗?
-
控件全部添加到设计器中。有些地方确实调整了我的一些类的 ReadOnly 属性以在属性网格中显示;但是,据我所知,没有一个被调用。我确实调用了一些调整可浏览属性的代码;但是,即使我对此发表评论,它仍然会发生。
-
向问题添加代码
-
另外我刚刚意识到选项卡控件是由设计器放置的,没有选项卡页,但选项卡页和属性网格是在运行时添加的
-
是否涉及任何数据绑定? TabPages 是许多意外行为的来源。请参阅:https://stackoverflow.com/a/50119854/2592875。
标签: c# vb.net winforms radio-button