Vb.net 如何获得不允许选择的收音机盒?

Vb.net 如何获得不允许选择的收音机盒?,vb.net,winforms,Vb.net,Winforms,我在面板顶部有一对单选按钮,可以作为一个单选框使用,基本上没有问题,但我需要用户有两个都不选中的选项,我希望用户选择零或其中一个选项。当窗体显示时,它们都未选中,但在用户选中其中一个后,无法恢复到原始状态。我希望点击所选的广播框会清除它。我模糊地记得我在X/Motif时代的经历,但这似乎没有发生 如何对单选按钮进行编程以允许两个按钮都未选中?或者我应该为此使用其他控件吗?您可以使用复选框,它们可以被选中或取消选中 如果确实要取消选中单选按钮,请使用以下代码: Private Sub RadioB

我在面板顶部有一对单选按钮,可以作为一个单选框使用,基本上没有问题,但我需要用户有两个都不选中的选项,我希望用户选择零或其中一个选项。当窗体显示时,它们都未选中,但在用户选中其中一个后,无法恢复到原始状态。我希望点击所选的广播框会清除它。我模糊地记得我在X/Motif时代的经历,但这似乎没有发生


如何对单选按钮进行编程以允许两个按钮都未选中?或者我应该为此使用其他控件吗?

您可以使用复选框,它们可以被选中或取消选中

如果确实要取消选中单选按钮,请使用以下代码:

Private Sub RadioButton1_MouseDown(sender As Object, e As MouseEventArgs) Handles RadioButton1.MouseDown
    If RadioButton1.Checked = True Then
        Dim thr As New Threading.Thread(AddressOf unticker)
        thr.Start()
    End If
End Sub
Private Sub unticker()
    Threading.Thread.Sleep(100)
    Do Until RadioButton1.Checked = False
        Invoke(Sub() RadioButton1.Checked = False)
    Loop
End Sub

对每个单选按钮单独使用此按钮

没有内置方式来完成您的要求。我们自己做这件事并不难。下面是示例代码,它演示了如何做到这一点

C版本:

private void Initialize()
{
    radioButton1.AutoCheck = false;
    radioButton2.AutoCheck = false;

    radioButton1.Click += radioButton_Click;
    radioButton2.Click += radioButton_Click;
}

void radioButton_Click(object sender, EventArgs e)
{
    RadioButton radio = (RadioButton)sender;
    radio.Checked = !radio.Checked;
    if (!radio.Checked)
    {
        return;
    }

    var otherRadios = radio.Parent
                           .Controls
                           .OfType<RadioButton>()
                           .Where(r => r != radio);
    foreach (var r in otherRadios)
    {
        r.Checked = !radio.Checked;
    }
}
Vb.net版本:使用


如果你认为hatke应该很简单。。创建自定义控件

Imports System.ComponentModel
Public Class MyRadio
    Inherits RadioButton

    Private _permitted As Boolean = True
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    <Browsable(True)> _
    Public Property Permitted() As Boolean
        Get
            Return _permitted
        End Get
        Set(ByVal value As Boolean)
            _permitted = value
        End Set
    End Property

    Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
        If _permitted Then MyBase.OnClick(e)
    End Sub
End Class

您可以添加第三个单选按钮,并将其文本设置为“无”或其他。它清楚地传达了不选择任何东西是一种选择的思想。如果用户尝试选中第二个复选框,请以编程方式取消选中第一个复选框。但是可以有多个复选框,单选按钮不允许这样做。您必须添加一些条件代码,以禁止同时选中两个复选框。为什么需要按钮?为什么不只是勾选复选框,如果另一个复选框被勾选,取消勾选?!是的,你也可以这样做直到。。。调用Sub以设置。。。循环既不精确,也不实用。这是浪费CPU时间,如果有的话。错误的语言!问题被标记为VB!干得好我觉得不错。
Imports System.ComponentModel
Public Class MyRadio
    Inherits RadioButton

    Private _permitted As Boolean = True
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    <Browsable(True)> _
    Public Property Permitted() As Boolean
        Get
            Return _permitted
        End Get
        Set(ByVal value As Boolean)
            _permitted = value
        End Set
    End Property

    Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
        If _permitted Then MyBase.OnClick(e)
    End Sub
End Class
myRadio1.Permitted = False 'Assigning it to false will not allow you to select it.