【问题标题】:How to iterate different control types (Checkbox and TextBox) combined and at the same time in C#如何在 C# 中组合并同时迭代不同的控件类型(复选框和文本框)
【发布时间】:2017-11-01 16:58:45
【问题描述】:

我正在开发一个检查复选框是否被选中的程序。然后使用它的 text 属性来处理更多的东西。 我添加了 numericUpDown 框,让用户可以输入自己的值。到目前为止,我正在迭代所有复选框并检查其中一些是否被选中。但是现在我想迭代复选框,如果其中一个被选中,我想在选中的复选框下方的 numericUpDown 框中获取数字。

一次迭代复选框和 numericUpDown 框的最佳方法是什么? 我应该将它们分组吗?还是将它们放入一个额外的面板中?

到目前为止,我是这样迭代复选框的:

foreach (Control c in panel1.Controls)
    {
        if ((c is CheckBox) && ((CheckBox)c).Checked)
        {
        //Do some stuff
        }
    }

我很抱歉我的英语不好,希望有人能提供帮助。谢谢。

【问题讨论】:

  • 是的,将 CheckBox 和 NumericUpDown 分组到 UserControl 中。现在事情自然相关。
  • 拉斯说了什么。或者,放弃它并使用 MVVM,这样的事情就变得微不足道了。
  • 请注意,如果您一次只选中一个复选框,那么最好使用单选按钮
  • 同时勾选了多个复选框。
  • @SardarAgabejli 你说的有问题我正在迭代所有复选框并检查是否有一个复选框被选中

标签: c# winforms controls


【解决方案1】:

正如 Lars 建议的那样,创建将复选框和 numericUpDown 组合在一起的用户控件是个好主意:

public partial class ToggleNumericControl : UserControl
{
    public ToggleNumericControl()
    {
        InitializeComponent();
    }

    public override string Text
    {
        get { return checkBox.Text;  }
        set { checkBox.Text = value; }
    }

    public bool Checked
    {
        get { return checkBox.Checked;  }
        set { checkBox.Checked = value; }
    }

    public decimal Value
    {
        get { return numericUpDown.Value; }
        set { numericUpDown.Value = Value; }
    }
}

当然,您可以在此处实现其他功能。例如。未选中复选框时禁用 numericUpDown。

将此类控件放置到您的表单中,然后您可以通过这种方式选择选中的值:

var selectedValues = from tn in panel1.Controls.OfType<ToggleNumericControl>()
                     where tn.Checked
                     select tn.Value;

【讨论】:

  • 感谢您的回答!但我还有一个问题。正如您在屏幕截图中看到的,复选框具有不同的名称。当复选框文本已经绑定到用户控件时,有没有办法更改它?我的意思是,是否有可以手动设置文本的 Text 属性?还是我必须以编程方式执行此操作?谢谢!
  • @SardarAgabejli 是的,用户控件具有虚拟属性 Text 您可以覆盖它,以便它可以写入和读取复选框文本的值。但是您应该考虑该文本的空间 - 它应该是固定宽度,或者您应该使其可调整大小(例如,通过将两个控件都放置到表格布局面板)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多