1

赢表格。VB.NET VS 2010 专业版。所以我正在构建一个表单,它的一侧有 3 个单选按钮......然后在左侧我有 2 个名为 Group1 和 Group2 的组框,用于我放置在设计器中的这个问题,以便一个覆盖另一个一个并将两个组框的可见属性都设置为false。当用户单击第二个单选框时 group1.visible 更改为 true 并且 group2.Visible 更改为 false ..当用户单击第三个单选框 group1.visible 更改为 false 和 group2.visible 更改为 true。如果用户单击第一个单选按钮 group1 和 group2 可见更改为false...现在问题...这根本不起作用..只有一个组框显示...如果我打开设计器并且仅改变哪个在底部然后它会显示而不是另一个..

Private Sub SP_Radio_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SP_Radio.GotFocus
    SP_Radio.Checked = True
    OP_Radio.Checked = False
    AP_Radio.Checked = False
    If SP_Radio.Checked = True Then
        unitType = 0
        ApartmentGroup.Visible = False
        OfficeGroup.Visible = False
        Call _setLabelColors(False)
    End If
    p_saveChangesButton.Focus()
End Sub

Private Sub OP_Radio_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OP_Radio.GotFocus
    OP_Radio.Checked = True
    AP_Radio.Checked = False
    SP_Radio.Checked = False
    If OP_Radio.Checked = True Then
        unitType = 1
        ApartmentGroup.Visible = False
        OfficeGroup.Visible = True
        Call _setLabelColors(True)

    End If
    p_saveChangesButton.Focus()
End Sub

Private Sub AP_Radio_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AP_Radio.GotFocus
    AP_Radio.Checked = True
    OP_Radio.Checked = False
    SP_Radio.Checked = False
    If AP_Radio.Checked = True Then
        unitType = 2
        OfficeGroup.Visible = False
        ApartmentGroup.Visible = True
        Call _setLabelColors(True)
    End If
    p_saveChangesButton.Focus()
End Sub

有任何想法吗????

4

2 回答 2

2

您不能将一个组框放在另一个组框上。如果这样做,这个重叠的组框将成为下面的组框的孩子。您可以使用 Panel 控件来实现这一点。

将您的单选按钮放在组框中,然后将两个组框分开放置(不应相互重叠)。现在使用以下代码,它可以工作。

private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                groupBox1.Visible = false;
                groupBox2.Visible = false;
            }
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton2.Checked)
            {
                groupBox1.Visible = true;
                groupBox2.Visible = false;
            }
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton3.Checked)
            {
                groupBox1.Visible = false;
                groupBox2.Visible = true;
            }
        }

现在变化不大,将两个面板控件相互重叠并检查:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                panel1.Visible = false;
                panel2.Visible = false;
            }
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton2.Checked)
            {
                panel1.Visible = true;
                panel2.Visible = false;
            }
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton3.Checked)
            {
                panel1.Visible = false;
                panel2.Visible = true;
            }
        }

现在它将按您的意愿工作

于 2012-05-02T15:53:16.340 回答
1

您在触发相应单选按钮上的 CheckedChanged 事件的 checkedChanged 事件中设置了 checked 属性。这将根据上次触发的 CheckedChanged 事件更改当前可见的左侧 GroupBox。

一个简单的方法是在更改选中的属性之前禁用所有事件处理程序,并在完成后重新启用它们

Try
    RemoveHandler AP_Radio.CheckedChanged, AddressOf AP_Radio_CheckedChanged
    RemoveHandler OP_Radio.CheckedChanged, AddressOf OP_Radio_CheckedChanged
    RemoveHandler SP_Radio.CheckedChanged, AddressOf SP_Radio_CheckedChanged

    ' do your work

Finally
    AddHandler AP_Radio.CheckedChanged, AddressOf AP_Radio_CheckedChanged
    AddHandler OP_Radio.CheckedChanged, AddressOf OP_Radio_CheckedChanged
    AddHandler SP_Radio.CheckedChanged, AddressOf SP_Radio_CheckedChanged
End Try

为了安全起见,将所有内容封装在 Try/Finally 块中。
这样,事件处理程序将在出现异常时重新启用。

于 2012-05-02T14:29:35.197 回答