在通常情况下,面板中一次只能检查一个RadioButton。
现在我有一个Panel(主要用于实现垂直滚动),其中包含一个两列的TableLayoutPanel。通过单击“添加行”按钮,可以将新行无限地添加到TLP(这就是为什么我需要面板向下滚动)。
TLP中的每一行看起来都一样:
第一列包含具有一个列和两行的另一个TLP。第一行仅包含一个RadioButton,第二行仅包含另一个按钮。
第二列包含一个CheckedListBox。
所以,我们在TLP中添加了5行。所以我有5个RadioButtons。不知道为什么,但是可以一次检查RadioButtons。我该如何避免呢?
以下是将行添加到TLP中的代码:
void add_newbox()
{
var new_chklistbox = new CheckedListBox{
Dock=DockStyle.Fill,
Margin=new Padding(0,0,0,3),
Location=new Point(20,0),
Size=new Size(238,94),
HorizontalScrollbar=true,
CheckOnClick=true
};
var new_radiobutton = new RadioButton{
Text="",
Dock=DockStyle.Fill,
Location=new Point(3,3),
Size=new Size(14,90),
MaximumSize=new Size(0,90)
};
new_radiobutton.Click += (sender, e) => this.focus=new_chklistbox;
var new_rembutton = new Button{
Text="-",
Dock=DockStyle.Fill,
AutoSize=true,
AutoSizeMode=AutoSizeMode.GrowAndShrink,
Margin=new Padding(0)
};
new_rembutton.Click += (sender, e) => rem_items();
var new_tbl = new TableLayoutPanel{
RowCount=2,
ColumnCount=1,
Dock=DockStyle.Fill,
Margin=new Padding(0)
};
new_tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 70F));
new_tbl.RowStyles.Add(new RowStyle(SizeType.AutoSize));
new_tbl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
new_tbl.Controls.Add(new_radiobutton,0,0);
new_tbl.Controls.Add(new_rembutton,0,1);
tbl_groups.Controls.Add(new_tbl,0,tbl_groups.RowCount);
tbl_groups.Controls.Add(new_chklistbox,1,tbl_groups.RowCount);
}
问候,希拉
答案 0 :(得分:0)
使用单选按钮的GroupName属性。
答案 1 :(得分:0)
尝试一下。它可能对您有用。
void add_newbox()
{
var new_chklistbox = new CheckedListBox{
Dock=DockStyle.Fill,
Margin=new Padding(0,0,0,3),
Location=new Point(20,0),
Size=new Size(238,94),
HorizontalScrollbar=true,
CheckOnClick=true
};
var new_radiobutton = new RadioButton{
Text="",
Dock=DockStyle.Fill,
Location=new Point(3,3),
Size=new Size(14,90),
MaximumSize=new Size(0,90)
};
//new_radiobutton.Click += (sender, e) => this.focus=new_chklistbox;
var new_rembutton = new Button{
Text="-",
Dock=DockStyle.Fill,
AutoSize=true,
AutoSizeMode=AutoSizeMode.GrowAndShrink,
Margin=new Padding(0)
};
//new_rembutton.Click += (sender, e) => rem_items();
var new_tbl = new TableLayoutPanel{
RowCount=2,
ColumnCount=1,
Dock=DockStyle.Fill,
Margin=new Padding(0)
};
var new_panel = new Panel
{
Dock = DockStyle.Fill,
AutoSize = true,
Margin = new Padding(0)
};
new_panel.Controls.Add(new_radiobutton);
new_panel.Controls.Add(new_rembutton);
new_tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 70F));
new_tbl.RowStyles.Add(new RowStyle(SizeType.AutoSize));
new_tbl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
new_tbl.Controls.Add(new_panel, 0, 0);
答案 2 :(得分:0)
要使某些单选按钮作为一个组,应将它们全部托管在同一容器中。不同的表布局面板是不同的容器。它描述了行为。
如果出于任何原因想要保持原样,则需要将这些单选按钮的AutoCheck
属性设置为true并处理其中的Click
事件,以检查刚刚单击的按钮并取消选中其余按钮其中。
示例
private void Form1_Load(object sender, EventArgs e)
{
var radios = GetChildren(tableLayoutPanel1).OfType<RadioButton>();
foreach (var radio in radios)
{
radio.AutoCheck=false;
radio.Click += (obj, arg) =>
{
radio.Checked = true;
foreach(var r in radios)
if (r != radio)
r.Checked = false;
};
}
}
IEnumerable<Control> GetChildren(Control control)
{
foreach (Control c1 in control.Controls)
{
yield return c1;
foreach (Control c2 in GetChildren(c1))
yield return c2;
}
}
答案 3 :(得分:0)
我对您的代码进行了一些更改,并注释了旧代码。请尝试一下。在这段代码中,我将在现有的TPL控件中添加新行,而不是每次都添加新的TLP。
void add_newbox()
{
var new_chklistbox = new CheckedListBox
{
Dock = DockStyle.Fill,
Margin = new Padding(0, 0, 0, 3),
Location = new Point(20, 0),
Size = new Size(238, 94),
HorizontalScrollbar = true,
CheckOnClick = true
};
var new_radiobutton = new RadioButton
{
Text = "",
Dock = DockStyle.Fill,
Location = new Point(3, 3),
Size = new Size(14, 90),
MaximumSize = new Size(0, 90)
};
new_radiobutton.Click += (sender, e) => this.focus = new_chklistbox;
var new_rembutton = new Button
{
Text = "-",
Dock = DockStyle.Fill,
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowAndShrink,
Margin = new Padding(0)
};
new_rembutton.Click += (sender, e) => rem_items();
//var new_tbl = new TableLayoutPanel
//{
// RowCount = 2,
// ColumnCount = 1,
// Dock = DockStyle.Fill,
// Margin = new Padding(0)
//};
//new_tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 70F));
//new_tbl.RowStyles.Add(new RowStyle(SizeType.AutoSize));
//new_tbl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
//new_tbl.Controls.Add(new_radiobutton, 0, 0);
//new_tbl.Controls.Add(new_rembutton, 0, 1);
tbl_groups.RowCount = tbl_groups.RowCount + 1;
tbl_groups.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tbl_groups.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
tbl_groups.Controls.Add(new_radiobutton, 0, tbl_groups.RowCount - 1);
tbl_groups.Controls.Add(new_rembutton, 1, tbl_groups.RowCount - 1);
}
答案 4 :(得分:-1)
<RadioButton Content="{content}" GroupName="RadioGroupIdentifier"/>
我猜是您要找的东西。
编辑
没有注意到您指的是获胜表格(您可能会在问题中写出来,因为标签在阅读时经常被跳过)。
但是,您应该阅读this article from microsoft,这是有用的部分:
通常,默认情况下,每个RadioButton都分组在父GroupBox或Panel中。
没有其他简单的方法可以通过设计器来做到这一点。 您当然可以通过事件buuuut实现自己的逻辑。...我不建议这样做。