复选框使用C#作为单选按钮作出反应

时间:2015-03-17 05:52:31

标签: c# winforms

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

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

此外,还有简单的三个复选框分别表示三个选项和一个文本框。如果有人检查任何东西,那么texbox会显示所选的东西。

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

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

function solve(items) {
    var m = {}
    items.forEach((obj) => {
        var name = obj.name;
        var text = obj.text;
        if (!m[name]) {
            m[name] = new Set();
        }
        m[name].add(text);

    });
    var finalItemsList = [];
    Object.keys(m).forEach((name) => {
        Array.from(m[name]).forEach((text) => {
            finalItemsList.push({
                "name": name,
                "text": text
            })
        });

    });
    return finalItemsList;

}
console.log(items);

答案 2 :(得分:0)

我这样做,假设你使用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我只需使用一个单选按钮,使其看起来像一个复选框......

答案 3 :(得分:0)

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

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

enter image description here

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
}

答案 4 :(得分:0)

假设您在一个容器(如 CheckBox)中有几个 GroupBox 控件,在表单的加载事件中:

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

enter image description here

代码如下:

false