C# WinForms中单选按钮列表的第三方控件?
是否有任何控件可以从对象列表中动态创建一组单选按钮?类似于CheckedBoxList控件,但具有互斥选择。指出WinForms本机不存在此控件,但是否有任何第三方控件可以这样做?可能;不过,这更容易,也更适合自己编写(除非有人建议使用免费控件或更好的源代码,您可以将其放入项目中) 一点GUI智慧(这不是我编造的,但我懒得包含引用): 如果单选按钮列表中包含>7-10项,请使用列表框。 当然,我想要么你无法控制,要么如果你控制了,就不会满足于这个答案C# WinForms中单选按钮列表的第三方控件?,c#,.net,winforms,C#,.net,Winforms,是否有任何控件可以从对象列表中动态创建一组单选按钮?类似于CheckedBoxList控件,但具有互斥选择。指出WinForms本机不存在此控件,但是否有任何第三方控件可以这样做?可能;不过,这更容易,也更适合自己编写(除非有人建议使用免费控件或更好的源代码,您可以将其放入项目中) 一点GUI智慧(这不是我编造的,但我懒得包含引用): 如果单选按钮列表中包含>7-10项,请使用列表框。 当然,我想要么你无法控制,要么如果你控制了,就不会满足于这个答案 向窗体中添加可滚动的面板 在代码中,循环遍
- 向窗体中添加可滚动的面板
- 在代码中,循环遍历对象列表。在循环内部:
- 制作一个新的单选按钮
- 将.top属性设置为上一个属性的.bottom(如果没有上一个属性,则设置为0)
- 将对象的副本放在.Tag属性中(这样您就可以知道选择了哪个对象)
- 设置宽度,使可滚动控件中不会出现水平滚动条
- 适当地设置.text。您可能需要截断以避免缠绕。如果要对包裹的线进行多行处理,则必须增加高度,但这需要使用control.creategraphics、graphics.MeasureString和其他GDI+功能进行大量操作。请参阅Bob Powell的GDI+常见问题解答
- 添加一个处理程序,以便可以处理checkchanged(AddHandler MyRB,addressof CC_Sub)
- 将其添加到可滚动控件
- 添加上面提到的CC_子项-可以通过添加单选按钮、打开CheckChanged处理程序并删除单选按钮来获得正确的函数签名
- 在此子部分中,将类类型的表单级变量设置为发送者的标记(您必须进行ctypeing)
- 当用户单击“确定”时,返回该变量,即拾取的对象
如果你想要更新奇的东西,你可以制作一个带有标签、复选框/单选按钮等的用户控件。您必须处理选择/取消选择。然后将usercontrol添加到可滚动的面板,而不是radiobutton。这提供了几乎无限的灵活性。也许;不过,这更容易,也更适合自己编写(除非有人建议使用免费控件或更好的源代码,您可以将其放入项目中) 一点GUI智慧(这不是我编造的,但我懒得包含引用): 如果单选按钮列表中包含>7-10项,请使用列表框。 当然,我想要么你无法控制,要么如果你控制了,就不会满足于这个答案
- 向窗体中添加可滚动的面板
- 在代码中,循环遍历对象列表。在循环内部:
- 制作一个新的单选按钮
- 将.top属性设置为上一个属性的.bottom(如果没有上一个属性,则设置为0)
- 将对象的副本放在.Tag属性中(这样您就可以知道选择了哪个对象)
- 设置宽度,使可滚动控件中不会出现水平滚动条
- 适当地设置.text。您可能需要截断以避免缠绕。如果要对包裹的线进行多行处理,则必须增加高度,但这需要使用control.creategraphics、graphics.MeasureString和其他GDI+功能进行大量操作。请参阅Bob Powell的GDI+常见问题解答
- 添加一个处理程序,以便可以处理checkchanged(AddHandler MyRB,addressof CC_Sub)
- 将其添加到可滚动控件
- 添加上面提到的CC_子项-可以通过添加单选按钮、打开CheckChanged处理程序并删除单选按钮来获得正确的函数签名
- 在此子部分中,将类类型的表单级变量设置为发送者的标记(您必须进行ctypeing)
- 当用户单击“确定”时,返回该变量,即拾取的对象
如果你想要更新奇的东西,你可以制作一个带有标签、复选框/单选按钮等的用户控件。您必须处理选择/取消选择。然后将usercontrol添加到可滚动的面板,而不是radiobutton。这提供了几乎无限的灵活性。控件供应商无法通过这样的控件赚钱。以下是一些开始使用的代码:
using System;
using System.Drawing;
using System.Windows.Forms;
class RadioList : ListBox {
public event EventHandler SelectedOptionChanged;
public RadioList() {
this.DrawMode = DrawMode.OwnerDrawFixed;
this.ItemHeight += 2;
}
public int SelectedOption {
// Current item with the selected radio button
get { return mSelectedOption; }
set {
if (value != mSelectedOption) {
Invalidate(GetItemRectangle(mSelectedOption));
mSelectedOption = value;
OnSelectedOptionChanged(EventArgs.Empty);
Invalidate(GetItemRectangle(value));
}
}
}
protected virtual void OnSelectedOptionChanged(EventArgs e) {
// Raise SelectOptionChanged event
EventHandler handler = this.SelectedOptionChanged;
if (handler != null) handler(this, e);
}
protected override void OnDrawItem(DrawItemEventArgs e) {
// Draw item with radio button
using (var br = new SolidBrush(this.BackColor))
e.Graphics.FillRectangle(br, e.Bounds);
if (e.Index < this.Items.Count) {
Rectangle rc = new Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Height, e.Bounds.Height);
ControlPaint.DrawRadioButton(e.Graphics, rc,
e.Index == SelectedOption ? ButtonState.Checked : ButtonState.Normal);
rc = new Rectangle(rc.Right, e.Bounds.Top, e.Bounds.Width - rc.Right, e.Bounds.Height);
TextRenderer.DrawText(e.Graphics, this.Items[e.Index].ToString(), this.Font, rc, this.ForeColor, TextFormatFlags.Left);
}
if ((e.State & DrawItemState.Focus) != DrawItemState.None) e.DrawFocusRectangle();
}
protected override void OnMouseUp(MouseEventArgs e) {
// Detect clicks on the radio button
int index = this.IndexFromPoint(e.Location);
if (index >= 0 && e.X < this.ItemHeight) SelectedOption = index;
base.OnMouseUp(e);
}
protected override void OnKeyDown(KeyEventArgs e) {
// Turn on option with space bar
if (e.KeyData == Keys.Space && this.SelectedIndex >= 0) SelectedOption = this.SelectedIndex;
base.OnKeyDown(e);
}
private int mSelectedOption;
}
使用系统;
使用系统图;
使用System.Windows.Forms;
类放射科医生:列表框{
公共事件处理程序SelectedOptionChanged;
公共放射科医生(){
this.DrawMode=DrawMode.OwnerDrawFixed;
此项高度+=2;
}
公共整数选择选项{
//具有选定单选按钮的当前项目
获取{return mSelectedOption;}
集合{
if(值!=mSelectedOption){
无效(GetItemRectangle(mSelectedOption));
mSelectedOption=值;
OnSelectedOptionChanged(EventArgs.Empty);
失效(GetItemRectangle(值));
}
}
}
选定选项更改时受保护的虚拟无效(事件参数e){
//引发SelectOptionChanged事件
EventHandler=this.SelectedOptionChanged;
if(handler!=null)handler(this,e);
}
受保护的覆盖无效OnDrawItem(DrawItemEventArgs e){
//使用单选按钮绘制项目
使用(var br=new SolidBrush(this.BackColor))
e、 图形填充矩形(br,e.Bounds);
如果(e.索引<本.项目.计数){
矩形rc=新矩形(e.Bounds.Left,e.Bounds.Top,e.Bounds.Height,e.Bounds.Height);
ControlPaint.DrawRadioButton(如图形、rc、,