我想通过单击第二个从组框1中获取文本。如何通过事件实现此功能?我不是C#程序员。
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"));
}
}
}
答案 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
布局将与您定义的布局相同。
Name属性可用于从后面的代码访问元素。
在每个组中,我们将单选按钮定义为:
在Form1.cs [design]中,通过单击元素,您将能够更改其属性。从下面的图片中,您可以看到如何访问radioButton1 groupBox1的文本。
在Form1.cs [design]中,通过单击一个元素,您将能够添加事件处理程序。
一旦在表单中添加了任何内容,后面的代码就会反映出来。
请记住,您的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);
}
}