【问题标题】:Radio buttons not working to select something单选按钮无法选择某些内容
【发布时间】:2019-04-02 19:11:50
【问题描述】:

我正在尝试创建一个对话框,其中包含 3 个单选按钮和一个“演示”按钮,以便与我们拥有的某些投影仪软件一起使用。我想要做的是,在单击“呈现”后,打开一个特定于使用单选按钮选择的房间的文件。

问题是,点击“Present”后没有任何反应。

我知道Process.Startpresent_Click 是正确的;在一个测试项目中,我做了“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;
           }
       }

有人可以帮我处理这些单选按钮吗?

【问题讨论】:

  • 为什么不在你的代码中加入一些 try{}catch{} 块。还有当你尝试调试小代码时会发生什么

标签: c# visual-studio


【解决方案1】:

您的 CheckedChanged 事件处理程序肯定搞砸了。

用英语,你的逻辑说

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

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

这里的重要知识是用户单击单选按钮会自动设置Checked 属性。无需在代码隐藏中自己做。

【讨论】:

  • 以为我的逻辑似乎不对...是的,文本文件“开始”只是为了测试目的。感谢您的帮助!
【解决方案2】:

我认为您需要删除在选中或取消选中时触发的事件。如果我理解正确,您只希望在单击Present 时发生“某事”。所以一旦有人点击Present,然后验证哪些复选框是开/关的,并做适当的事情:

对不起,如果我做出错误的假设,请随时纠正。

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");
            }
        }
    }
}

【讨论】:

  • else 实际上更好(虽然技术上不需要),因为它允许评估在找到匹配项后立即“短路”。
  • @BradleyDotNET 假设您只希望在单击“出席”后发生 1 个且仅 1 个房间进程,在这种情况下,只需使用 3 个按钮:Present1Present2Present3。这是不寻常的,因为 OP 使用 3 个复选框,这可能意味着应该同时发生多件事。
  • 他说“单选按钮”(不是复选框)暗示他只想要一个。也许出于用户体验的原因,他不想要 3 个按钮。你说得对,如果它是复选框, else 会破坏功能。
  • @Vlad 感谢您的回答,我最终使用了您建议的 3 个按钮。您回答的代码是我最初拥有的代码,它也不起作用。但是这三个按钮效果很好,我只想要单选按钮,以防用户选择了错误的房间。感谢您的帮助!
猜你喜欢
  • 2011-07-27
  • 2017-07-24
  • 2018-09-17
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多