C# 单选按钮无法选择某些内容

C# 单选按钮无法选择某些内容,c#,visual-studio,C#,Visual Studio,我正在尝试创建一个对话框,其中包含3个单选按钮和一个“显示”按钮,用于我们的一些投影仪软件。我想做的是,单击“显示”后,用单选按钮打开一个文件,该文件特定于选择的房间 问题是,单击“显示”后,什么都没有发生 我知道过程。启动和显示\u单击是正确的;在一个测试项目中,我成功地使用“Present”按钮打开了一个文件。我确信CheckedChanged部分可能不正确,但我不知道如何处理它们 这是我的密码: using System; using System.Collections.

我正在尝试创建一个对话框,其中包含3个单选按钮和一个“显示”按钮,用于我们的一些投影仪软件。我想做的是,单击“显示”后,用单选按钮打开一个文件,该文件特定于选择的房间

问题是,单击“显示”后,什么都没有发生

我知道
过程。启动
显示\u单击
是正确的;在一个测试项目中,我成功地使用“Present”按钮打开了一个文件。我确信
CheckedChanged
部分可能不正确,但我不知道如何处理它们

这是我的密码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Diagnostics;

    namespace WindowsFormsApplication1
    {
       public partial class Form1 : Form
       {
           public Form1()
           {
               InitializeComponent();
           }

           public void present_Click(object sender, EventArgs e)
           {
               if (room1.Checked)
               {
                    System.Diagnostics.Process.Start(@"room1.txt");
               }
               else if (room2.Checked)
               {
                    System.Diagnostics.Process.Start(@"room2.txt");
               }
               else if (room3.Checked)
               {
                   System.Diagnostics.Process.Start(@"room3.txt");
               }
           }

           private void room1_CheckedChanged(object sender, EventArgs e)
           {
               room1.Checked = true;
           }

           private void room2_CheckedChanged(object sender, EventArgs e)
           {
               room2.Checked = true;
           }

           private void room3_CheckedChanged(object sender, EventArgs e)
           {
               room3.Checked = true;
           }
       }

有人能帮我弄一下这些单选按钮吗?

你的CheckedChanged事件处理程序肯定是一团糟

在英语中,你的逻辑是

只要单选按钮的选中状态发生更改,请将其选中属性设置为true

老实说,我很惊讶你没有进入一个无限循环,在这个循环中,每个控件都在努力成为“选中的一个”。完全消除这种逻辑可能会很好地解决您的问题。您正在“启动”一个文本文件似乎也很奇怪,但我认为这是有意的


这里的重要知识是,用户单击单选按钮会自动设置
Checked
属性。不需要自己在代码隐藏中执行此操作。

您的CheckedChanged事件处理程序肯定是一团糟

在英语中,你的逻辑是

只要单选按钮的选中状态发生更改,请将其选中属性设置为true

老实说,我很惊讶你没有进入一个无限循环,在这个循环中,每个控件都在努力成为“选中的一个”。完全消除这种逻辑可能会很好地解决您的问题。您正在“启动”一个文本文件似乎也很奇怪,但我认为这是有意的


这里的重要知识是,用户单击单选按钮会自动设置
Checked
属性。不需要自己在代码隐藏中执行此操作。

我认为您需要删除在选中或取消选中时触发的事件。如果我理解正确,您只希望在单击“显示”时发生“某些事情”。因此,一旦有人单击“显示”
,然后验证哪些复选框处于打开/关闭状态,并执行适当的操作:

对不起,如果我做出了错误的假设,请随意更正

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {       
        public Form1()
        {
            InitializeComponent();
        }

        public void present_Click(object sender, EventArgs e)
        {
            if (room1.Checked)
            {
                System.Diagnostics.Process.Start(@"room1.txt");
            }
            else if (room2.Checked)
            {
                System.Diagnostics.Process.Start(@"room2.txt");
            }
            else (room3.Checked)
            {
                System.Diagnostics.Process.Start(@"room3.txt");
            }
        }
    }
}

我认为您需要删除在选中或取消选中时触发的事件。如果我理解正确,您只希望在单击“显示”时发生“某些事情”。因此,一旦有人单击“显示”
,然后验证哪些复选框处于打开/关闭状态,并执行适当的操作:

对不起,如果我做出了错误的假设,请随意更正

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {       
        public Form1()
        {
            InitializeComponent();
        }

        public void present_Click(object sender, EventArgs e)
        {
            if (room1.Checked)
            {
                System.Diagnostics.Process.Start(@"room1.txt");
            }
            else if (room2.Checked)
            {
                System.Diagnostics.Process.Start(@"room2.txt");
            }
            else (room3.Checked)
            {
                System.Diagnostics.Process.Start(@"room3.txt");
            }
        }
    }
}

为什么不在代码中放一些try{}catch{}块呢。。还有,当您尝试调试小代码时会发生什么?为什么不在代码中放入一些try{}catch{}块呢。。另外,当您尝试调试小代码时会发生什么情况else实际上更好(虽然技术上不需要),因为它允许评估在找到匹配项时“短路”。@BradleyDotNET假设您只希望在单击“呈现”后发生1个且仅发生1个文件室进程,在这种情况下,只需使用3个按钮:
Present1
Present2
Present3
。这是不寻常的,因为OP使用了3个复选框,这可能意味着多件事情应该同时发生。他说“单选按钮”(而不是复选框)意味着他只想要一个。也许出于用户体验的原因,他不想要3个按钮。您说如果是复选框,else将破坏该功能,这是正确的。@Vlad谢谢您的回答,我最终使用了您建议的3个按钮。您回答的代码是我原来的代码,但也不起作用。然而,这三个按钮工作得非常好,我只想要单选按钮,以防用户选择了错误的房间。谢谢你的帮助!else实际上更好(虽然技术上不需要),因为它允许评估在找到匹配项时“短路”。@BradleyDotNET假设您只希望在单击“呈现”后发生一个且仅发生一个房间过程,在这种情况下,只需使用3个按钮:
Present1
Present2
Present3
。这是不寻常的,因为OP使用了3个复选框,这可能意味着多件事情应该同时发生。他说“单选按钮”(而不是复选框)意味着他只想要一个。也许出于用户体验的原因,他不想要3个按钮。您说如果是复选框,else将破坏该功能,这是正确的。@Vlad谢谢您的回答,我最终使用了您建议的3个按钮。您回答的代码是我原来的代码,但也不起作用。然而,这三个按钮工作得非常好,我只想要单选按钮,以防用户选择了错误的房间。谢谢你的帮助!我觉得我的逻辑似乎不正确。。。是的,文本文件“开始”只是为了测试。谢谢你的帮助!我觉得我的逻辑似乎不正确。。。是的,文本文件“开始”只是为了测试。谢谢你的帮助!