如何在C#中组合2个分组框?

时间:2018-12-22 22:26:52

标签: c# winforms events delegates

我想通过单击第二个从组框1中获取文本。如何通过事件实现此功能?我不是C#程序员。

enter image description here

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp9
{
    public partial class Form1 : Form
    {
        GroupBox GetGroupBox(string header)
        {
            GroupBox box = new GroupBox()
            {
                AutoSize = true
            };
            TableLayoutPanel layout = new TableLayoutPanel()
            {
                AutoSize = true
            };
            layout.Controls.Add(new Label() { Text = header });
            box.Controls.Add(layout);
            for (uint i = 0; i < 2; ++i)
                layout.Controls.Add(new RadioButton() { Text = i.ToString() });
            return box;
        }
        public Form1()
        {
            InitializeComponent();
            TableLayoutPanel layout = new TableLayoutPanel()
            {
                AutoSize = true
            };
            Controls.Add(layout);
            layout.Controls.Add(GetGroupBox("Group box 1"));
            layout.Controls.Add(new Label() { Text = new string('-', 10) });
            layout.Controls.Add(GetGroupBox("Group box 2"));
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我对您的代码进行了一些更改,但是我觉得我应该在此警告您,因为这很可能不是解决您所遇到问题的优雅或可扩展的解决方案。我已经向单选按钮的click事件中添加了一个事件处理程序-通过添加默认情况下设置为false的boolean addEventHandler变量。处理事件的逻辑不是最好的方法,但是...希望对您有所帮助。

GroupBox GetGroupBox(string header, bool addEventHandler = false)
        {
            GroupBox box = new GroupBox()
            {
                AutoSize = true,
                Name = header
            };
            TableLayoutPanel layout = new TableLayoutPanel()
            {
                AutoSize = true
            };
            layout.Controls.Add(new Label() { Text = header });
            box.Controls.Add(layout);

            for (uint i = 0; i < 2; ++i)
            {
                var rbtn = new RadioButton() { Text = i.ToString() };
                if (addEventHandler)
                {
                    rbtn.Click += Form1_Click;
                }                
                layout.Controls.Add(rbtn);
            }

            return box;
        }

        public Form1()
        {
            InitializeComponent();

            TableLayoutPanel layout = new TableLayoutPanel()
            {
                AutoSize = true
            };
            layout.Controls.Add(GetGroupBox("Group box 1"));
            layout.Controls.Add(new Label() { Text = new string('-', 10) });
            layout.Controls.Add(GetGroupBox("Group box 2", true));
            Controls.Add(layout);
        }

        private void Form1_Click(object sender, EventArgs e)
        {
            var group1Selected = this.Controls[0].Controls[0].Controls[0].Controls;
            var senderControl = (RadioButton)sender;

            if (senderControl.Parent.Parent.Name == "Group box 2")
            {
                for (int i = 0; i < group1Selected.Count; i++)
                {
                    if (group1Selected[i] is RadioButton)
                    {
                        var rb = group1Selected[i] as RadioButton;
                        if (rb.Checked)
                        {
                            DialogResult rst = MessageBox.Show("Expected Message: " + rb.Text);
                        }
                    }
                }
            }            
        }

答案 1 :(得分:0)

除非另有说明,否则我将使用Form1.cs [design]中的“工具箱”插入内容。

您可以从菜单访问“工具箱”:视图->工具箱。

您可以从此处将内容拖放到表单中。 https://docs.microsoft.com/en-us/visualstudio/ide/reference/toolbox?view=vs-2017

布局将与您定义的布局相同。

  • 主容器是一个TableLayoutPanel(名称为tableLayoutPanel1)。
  • 左上方GroupBox(名称为groupBox1)
  • 左下GroupGroup2(groupBox2)
  • 右上角文本框(名称textBox1设置为只读)。

Name属性可用于从后面的代码访问元素。

在每个组中,我们将单选按钮定义为:

  • radioButton1 / 2 for groupBox1
  • groupBox2的radioButton3 / 4

在Form1.cs [design]中,通过单击元素,您将能够更改其属性。从下面的图片中,您可以看到如何访问radioButton1 groupBox1的文本。

enter image description here

在Form1.cs [design]中,通过单击一个元素,您将能够添加事件处理程序。

enter image description here

一旦在表单中添加了任何内容,后面的代码就会反映出来。

请记住,您的Form1类将只需要处理radioButton3 / 4 groupBox2发生单击时的逻辑,并相应地更新textBox1.text属性。

该类将非常简单:

   public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.textBox1.ReadOnly = true;
    }

    //as the radio buttons are in a group box they be mutually exclusive
    private void radioButton3_CheckedChanged(object sender, EventArgs e)
    {
        if (this.radioButton3.Checked || radioButton4.Checked)
        {
            int val = this.radioButton1.Checked ? 0 : 1;
            textBox1.Text = String.Format("Expected msg:{0}", val);
        }
    }

    //as the radio buttons are in a group box will be mutually exclusive
    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        radioButton3_CheckedChanged(sender, e);
    }
}