C# - 如何从每个单选框GroupBox单独返回int值?

时间:2016-06-15 10:24:57

标签: c# wpf excel radio-button

请允许我澄清我的情况和方法。

我有一个包含10列的Excel文件。前五列包含构成查询条件的数据,而最后五列包含构成结果的数据。

  

我正在尝试在数据库或excel中创建包含此数据的软件   (如果数据库很难)将链接前五列   到列表或菜单或目前五个不同组中的RadioButtons。   进行选择并按下SUBMIT按钮时,结果   将显示为excel或匹配行中的五个数据   数据库中。

这就是我想要实现的目标。

如果我的方法有误,请评论。提前感谢所有帖子。

--------------------------原始问题------------------- ---------

我在WPF上有5个groupbox(1个有5个radiobuttons,2个有3个,3个有4个,5个有4个)。 根据从每个groupBox中选择的radiobutton,软件预计将输出四个参数(来自CSV或数据库)

我使用过King {King}给出的How do I get which radio button is checked from a groupbox?代码,并修改它以用于我的目的。

var checkedRadio = new []{groupBox1, groupBox2, groupBox3, groupBox4, groupBox5}.SelectMany(g=>g.Controls.OfType<RadioButton>().Where(r=>r.Checked));
foreach(var c in checkedRadio)
    MessageBox.Show(c.Name);

这给了我一个接一个选择的无线电按钮作为消息框。

我要感谢King King和其他许多人(超过20人),他们对各种答案的回答帮助我达到了这一点。

我遇到的问题是如何使用foreach循环将值分配给五个单独的int,然后使用它来计算最终的int值,我可以将其分配给我想要显示的各种结果。

我尝试在每个CheckedChanged事件处理程序中为int赋值,但是所有这些都是私有的void并且没有返回任何内容。我试图改变它们以返回整数但我似乎无法破解那个坚果。

我确信我的整个方法在这里可能是错的,但我对此并不太了解。

//我基本上想要的是在g =五个组中提供选项,并根据这五个组中的选择(excel中的列),显示数据库中匹配行中4个相应列的结果。我目前的方法是一种解决方法,因为我不知道使用数据库.//

2 个答案:

答案 0 :(得分:0)

我认为你应该省略五个分开的 int分配值,但计算结果值。例如,让我们按位编码groupBox,并计算位掩码

  groupBox1 - 00001 (let it be checked)
  groupBox2 - 00010   
  groupBox3 - 00100 (let it be checked)   
  groupBox4 - 01000 (let it be checked)  
  groupBox5 - 10000
  -----------------
  mask        01101 (13)

因此,如果groupBox1groupBox3groupBox4检查,那么最终的掩码将为01101

var result = new [] {groupBox1, groupBox2, groupBox3, groupBox4, groupBox5}
  .Select((box, index) => new {
    box = box,
    mask = 1 << index
  }) 
  .Where(item => item.box.Controls
    .OfType<RadioButton>()
    .Any(button => button.Checked))
  .Sum(item => item.mask);

如果你必须使用任意权重将它们组织成集合,例如,数组

  double[] weights = new double[] {1.2, 3.58, 4.62, -1.7, 0.9};

  double result = new [] {groupBox1, groupBox2, groupBox3, groupBox4, groupBox5}
    .Select((box, index) => new {
       box = box,
       weight = weights[index] 
     }  
    .Where(item => item.box.Controls
       .OfType<RadioButton>()
       .Any(button => button.Checked))
    .Sum(item => item.weight);

指导原则保持不变:不要使用分隔值:因为控件(groupboxes)有集合,所以将相应的值放入集合中以及

答案 1 :(得分:0)

很抱歉,但是这个单独的收藏很丑陋。您应该根据具有int的复选框创建用户控件,或者使用控件的标记。您可以将组框作为控件,将计算抽象到表单,但这取决于您对它们执行的操作。

public class MyClass : CheckBox 
{
    public int MyValue { get; set; }

    public MyClass()
    {

    }
}

或者只是使用:

value = (int)myCheckBox.Tag;