C# WinForms中单选按钮列表的第三方控件?

C# WinForms中单选按钮列表的第三方控件?,c#,.net,winforms,C#,.net,Winforms,是否有任何控件可以从对象列表中动态创建一组单选按钮?类似于CheckedBoxList控件,但具有互斥选择。指出WinForms本机不存在此控件,但是否有任何第三方控件可以这样做?可能;不过,这更容易,也更适合自己编写(除非有人建议使用免费控件或更好的源代码,您可以将其放入项目中) 一点GUI智慧(这不是我编造的,但我懒得包含引用): 如果单选按钮列表中包含>7-10项,请使用列表框。 当然,我想要么你无法控制,要么如果你控制了,就不会满足于这个答案 向窗体中添加可滚动的面板 在代码中,循环遍

是否有任何控件可以从对象列表中动态创建一组单选按钮?类似于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、,