【问题标题】:Check Box react as Radio Button using C#复选框使用 C# 反应为单选按钮
【发布时间】:2021-04-06 02:52:03
【问题描述】:

我有一个要求在一个组框中添加三个复选框,并且复选框必须作为单选按钮做出反应,即, 1. 一次只能勾选一个复选框。 2.当用户去检查另一个复选框时,前一个自动应该被取消选中。 我也知道这不是一个好方法,而且对于非技术或技术用户来说真的很困惑,但我也想在这方面学习一些新东西。

我浏览了很多网站,但没有得到任何令人满意的解决方案。我希望我能得到你的好。

此外,还有简单的三个复选框,分别表示三个可供选择的内容和一个文本框。如果有人检查任何事物,则 texbox 会显示所选事物。

例如:- 复选框分别显示 C#、ASP.NET 和 MVC。 如果选择 C#,则文本框必须显示 C#。

谢谢... 感谢和问候, 拉文德拉。

【问题讨论】:

  • 请告诉我们当时的尝试。我们将帮助您更正您的代码
  • 先生,我目前在 BPO 工作。我可以在晚上显示我的代码。我可以从这里阅读和回复。
  • 为什么不使用 jQuery? C# 是服务器端脚本,您无法处理客户端事件,请查看此链接stackoverflow.com/questions/881166/…
  • Radio Button 用作Radio Button ??
  • 为什么 C# 是你唯一的标签?

标签: c# .net winforms checkbox radio-button


【解决方案1】:

您可以使用单选按钮来实现此功能。

【讨论】:

    【解决方案2】:

    您可以简单地使用另一个任务,例如每 50 毫秒更新一次的计时器, 以便禁用您要在此处禁用的复选框, 在您的“检查更改事件”中仅标记控件, 比如 checkbox1 = flagdcheckbx = 1 ;等等。

    private async Task writeTimer()
    {
       if(ignoreEvents == true)
       {
        ignoreEvents = false;
        switch(flagdcheckbx)
        {
         case 1:
             checkBox2.Checked = false;
             checkBox3.Checked = false;
           break;
         case 2:
             checkBox1.Checked = false;
             checkBox3.Checked = false;
           break;
         case 3:
             checkBox1.Checked = false;
             checkBox2.Checked = false;
           break;
        }
      }
    }
    
    private void radioCheckboxes_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox current = sender as CheckBox;
        if (current == checkBox1)
        {
            if (current.checked)
            {
                 ignoreEvents = true; 
                 flagdcheckbx=1;
            }
        }
        else if (current == checkBox2)
        {
            if (current.checked) // it should happen only when checked
            {
                 ignoreEvents = true; 
                 flagdcheckbx=2;
            }
        }
        else
        {
            if (current.checked)
            {
                 ignoreEvents = true; 
                 flagdcheckbx=3;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      假设您使用 winforms,我会这样做:

      public partial class Form1 : Form
      {
          private bool ignoreEvents = false;
      
          public Form1()
          {
              InitializeComponent();
      
              //set this handler to the events of all 3 checkboxes
              checkBox1.CheckedChanged += radioCheckboxes_CheckedChanged;
              checkBox2.CheckedChanged += radioCheckboxes_CheckedChanged;
              checkBox3.CheckedChanged += radioCheckboxes_CheckedChanged;
          }
      
          private void radioCheckboxes_CheckedChanged(object sender, EventArgs e)
          {
              if (!ignoreEvents)
              {
                  ignoreEvents = true; // otherwise the other checkboxes would react when i set the state programmatically
                  CheckBox current = sender as CheckBox;
                  if (current == checkBox1)
                  {
                      checkBox2.Checked = false;
                      checkBox3.Checked = false;
                  }
                  else if (current == checkBox2)
                  {
                      checkBox1.Checked = false;
                      checkBox3.Checked = false;
                  }
                  else
                  {
                      checkBox1.Checked = false;
                      checkBox2.Checked = false;
                  }
                  ignoreEvents = false;
              }
          }
      }
      

      使用 WPF,我只需为单选按钮使用一种样式,使其看起来像一个复选框...

      【讨论】:

      • 先生,我想您是说将单选按钮格式化为复选框,但我的问题是,为什么我们不能将代码应用到复选框中并反过来,它会提供更多编程新手的实用方法。
      • 我在 windows 窗体应用程序上使用 c#。
      • @RavindraBisht 你有 4 种可能性......要么使用上面的代码或使用中介模式(谷歌这个)或创建你自己的控件(你可以从 RadioButton 继承并覆盖它的绘制方式,这是不是一件容易的事)。最后但并非最不重要的一点是使用单选按钮,因为它们就像实用程序一样。如果没有严格要求您的单选按钮必须看起来像复选框,那么我会使用最后一种方法,因为如果您有多项选择和单一答案,通常使用单选按钮而不是复选框......
      • @RavindraBisht 相反,用户会被你的 UI 的意外行为弄糊涂
      • @RavindraBisht 也考虑使用组合框...它占用的空间更少,也是常见的做法
      【解决方案4】:

      我假设您知道如何在容器内对 RadioButton 控件进行分组,并且您只需为您的单选按钮组寻找 CheckBox 外观。

      作为一个选项,您可以修改我在 [这篇文章] 中分享的 RadioButtonList 并将 CheckBox 外观添加到其中。在下图中可以看到两个 RadioButtonList 控件,一个具有 CheckBox 外观,另一个具有 RadioButton 外观:

      radioButtonList1.DataSource = Enum.GetValues(typeof(DayOfWeek));
      radioButtonList1.Appearance = RadioButtonListAppearance.CheckBox;
      
      radioButtonList2.DataSource = Enum.GetValues(typeof(DayOfWeek));
      

      这里是添加Appearance属性的修改版代码:

      using System;
      using System.ComponentModel;
      using System.Drawing;
      using System.Windows.Forms;
      using System.Windows.Forms.VisualStyles;
      public class RadioButtonList : ListBox
      {
          RadioButtonListAppearance appearance = RadioButtonListAppearance.RadioButton;
          public RadioButtonListAppearance Appearance
          {
              get { return appearance; }
              set { appearance = value; Invalidate(); }
          }
          Size s;
          public RadioButtonList()
          {
              this.DrawMode = DrawMode.OwnerDrawFixed;
              using (var g = Graphics.FromHwnd(IntPtr.Zero))
                  s = RadioButtonRenderer.GetGlyphSize(
                      Graphics.FromHwnd(IntPtr.Zero), RadioButtonState.CheckedNormal);
          }
          protected override void OnDrawItem(DrawItemEventArgs e)
          {
      
              var text = (Items.Count > 0) ? GetItemText(Items[e.Index]) : Name;
              Rectangle r = e.Bounds; Point p;
              var flags = TextFormatFlags.Default | TextFormatFlags.NoPrefix;
              var selected = (e.State & DrawItemState.Selected) == DrawItemState.Selected;
              var state = selected ?
                  (Enabled ? RadioButtonState.CheckedNormal :
                             RadioButtonState.CheckedDisabled) :
                  (Enabled ? RadioButtonState.UncheckedNormal :
                             RadioButtonState.UncheckedDisabled);
              if (RightToLeft == System.Windows.Forms.RightToLeft.Yes)
              {
                  p = new Point(r.Right - r.Height + (ItemHeight - s.Width) / 2,
                      r.Top + (ItemHeight - s.Height) / 2);
                  r = new Rectangle(r.Left, r.Top, r.Width - r.Height, r.Height);
                  flags |= TextFormatFlags.RightToLeft | TextFormatFlags.Right;
              }
              else
              {
                  p = new Point(r.Left + (ItemHeight - s.Width) / 2,
                  r.Top + (ItemHeight - s.Height) / 2);
                  r = new Rectangle(r.Left + r.Height, r.Top, r.Width - r.Height, r.Height);
              }
              var bc = selected ? (Enabled ? SystemColors.Highlight :
                  SystemColors.InactiveBorder) : BackColor;
              var fc = selected ? (Enabled ? SystemColors.HighlightText :
                  SystemColors.GrayText) : ForeColor;
              using (var b = new SolidBrush(bc))
                  e.Graphics.FillRectangle(b, e.Bounds);
      
              if (appearance == RadioButtonListAppearance.RadioButton)
              {
                  RadioButtonRenderer.DrawRadioButton(e.Graphics, p, state);
              }
              else if (appearance == RadioButtonListAppearance.CheckBox)
              {
                  CheckBoxRenderer.DrawCheckBox(e.Graphics, p, (CheckBoxState)state);
              }
              else
              {
                  throw new InvalidOperationException("Appearance is invalid.");
              }
              TextRenderer.DrawText(e.Graphics, text, Font, r, fc, bc, flags);
              e.DrawFocusRectangle();
              base.OnDrawItem(e);
          }
          [Browsable(false), EditorBrowsable(EditorBrowsableState.Never),
          DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
          public override SelectionMode SelectionMode
          {
              get { return System.Windows.Forms.SelectionMode.One; }
              set { }
          }
          [Browsable(false), EditorBrowsable(EditorBrowsableState.Never),
          DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
          public override int ItemHeight
          {
              get { return (this.Font.Height + 2); }
              set { }
          }
          [EditorBrowsable(EditorBrowsableState.Never), Browsable(false),
          DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
          public override DrawMode DrawMode
          {
              get { return base.DrawMode; }
              set { base.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; }
          }
      }
      public enum RadioButtonListAppearance
      {
          RadioButton,
          CheckBox
      }
      

      【讨论】:

        【解决方案5】:

        假设您在像GroupBox 这样的容器中有几个CheckBox 控件,在表单的加载事件中:

        • 找到容器的所有CheckBox控件
        • CheckBox 控件的AutoCheck 属性设置为false
        • 处理CheckBox控件的Click事件并在事件处理程序中,将点击元素的Checked属性设置为true,其余设置为false

        代码如下:

        private void Form1_Load(object sender, EventArgs e)
        {
            var all = groupBox1.Controls.OfType<CheckBox>().ToList();
            foreach (CheckBox c in all)
            {
                c.AutoCheck = false;
                c.Click += (obj, args) =>
                {
                    var ThisCheckBox = (CheckBox)obj;
                    foreach( CheckBox cc in all.Except(new[] { ThisCheckBox  }))
                        cc.Checked = false;
                    ThisCheckBox.Checked = true;
                };
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多