返回首页

{A}{S0}
简介
这是。NET版本的我以前的MFC文章中,。一个几年前,我在Visual C成员的要求,实现一个自定义的ListBox控件类似于MFC的CCheckListBox论坛讨论,但单选按钮。最初,它似乎是微不足道的,因为独特的选择ListBox控件的版本符合要求,但我的结论是,这种控制有一定的优势:它是清楚的是选项是互斥单选按钮。这是一个很好的选择一组单选按钮,因为你必须保持只有一个控制,使用更少的内存。 它继承了一些有用的功能,如滚动排序,数据绑定和多列。这将是更容易动态地更改选项,演示应用程序所示。这将是更易于管理,选择事件,也显示在演示应用。使用代码
落实到你的项目RadioListBox,你只需要做几个步骤:纳入您的项目RadioListBox.cs。拖放到表单中RadioListBox的对象。变更控制的标准属性,就像一个ListBox。Countersense标准ListBox,透明的BackColor属性是允许的。
这就是全部!现在你可以使用作为一个经常性的ListBox中的单选按钮集合。您可以添加Items.Add()方法和SelectedIndex属性为用户选择查询项目。伪透明
一些。NET控件BackColor属性接受一个透明的颜色,但ListBox是不是其中之一。所以,透明度需要大量的管理技巧。然而,透明度是一个关键的功能,需要这种控制是有益的。它允许控制,获得一个真正的单选按钮的外观和感觉,你可以看到在上面的截图。我决定留在托管世界提供虚假的透明度,控制,通过重写BackColor属性,接受它,并保存自己的背景颜色的画笔。当设置背景色为透明,将模拟控制父窗体或控件,即使形成有一个非标准的背景颜色。RadioListBox内部
RadioListBox类是来自Windows窗体ListBox类的所有者绘制功能。恢复类定义如下:

using System.ComponentModel;

using System.Drawing;

using System.Windows.Forms.VisualStyles;



namespace System.Windows.Forms

{

    public class RadioListBox : ListBox

    {

        private StringFormat Align;

        private bool IsTransparent = false;  // Handles the transparent state

        private Brush BackBrush;  // Manages its own background brush



        // Allows the BackColor to be transparent

        public override Color BackColor ...



        // Hides these properties in the designer

        [Browsable(false)]

        public override DrawMode DrawMode ...



        [Browsable(false)]

        public override SelectionMode SelectionMode ...



        // Public constructor

        public RadioListBox() ...



        // Main painting method

        protected override void OnDrawItem(DrawItemEventArgs e) ...



        // Prevent background erasing

        protected override void DefWndProc(ref Message m) ...



        // Other event handlers

        protected override void OnHandleCreated(EventArgs e) ...

        protected override void OnFontChanged(EventArgs e) ...

        protected override void OnParentChanged(EventArgs e) ...

        protected override void OnParentBackColorChanged(EventArgs e) ...

    }

}

OnDrawItem()方法的核心是提升。该方法不突出标准ListBox控件中选定的项目,但绘制一个单选按钮,而不是。它还管理的重点国家,正确绘制焦点矩形和背景色的透明度属性。下面是C#源代码:{C}历史,2007年4月23日:第一个版本九月十四日,2007年:改进控制渲染(stephpms感谢);范围内的数据支持(PeterDP感谢) 9月1日,2008年:改进的背景画;大字体支持(rkousha感谢)

回答

评论会员:理查德MacCutchan 时间:2011/12/14
尼斯的文章,只是什么我是
寻找
评论会员:。UngaMan 时间:2011/12/14
!一个相互excluyent选项伟大的自定义控制
评论会员:游客 时间:2011/12/14
BiyukSadeghiLahijan
说的好
但不支持从右至左的语言,一些错误的多= TRUE
评论会员:。smercado 时间:2011/12/14
快速和易于使用的
格拉西亚斯POR aportacin
"
评论会员:Parveen_Basha 时间:2011/12/14
感谢很多
评论会员:!chetverg 时间:2011/12/14
我建议,而不是e.Font textBrush,边界,this.Align);"使用:
PropertyDescriptor的描述= TypeDescriptor.GetProperties(this.Items [e.Index])的DisplayMember]
e.Graphics.DrawString(descr.GetValue(this.Items [e.Index])的ToString(),e.​​Font,textBrush,界限,this.Align。)
评论会员:网络之星 时间:2011/12/14

请告诉我,我该如何绑定到一个通用的列表EntityState onject。我试图绑定使用 radiobuttonlist1.DataSource =清单;
但是,在RadioButtonList的那样
唯一的类名
MyProductExtensions.IM.ClientProxy.ImsServer.EntityState

如果我使用的DisplayMember ="文本",然后给出错误
不能施放对象MyProductExtensions.IM.ClientProxy.ImsServer.EntityState System.Data.DataRowView

请还告诉我怎样才能绑定datavalue RadioButtonList的。

公共类EntityState
{
私人字符串_TEXT;
& #160; 公共字符串Text
  ;{
得到{
返回_TEXT;
& #160; }
集合{
_TEXT =值;
}
  ; }
私人INT _value;
 0; 公共int值
{
&# 160; 得到
&# 160; {
返回_value;
}
 60; 集合
 60; {
_value =值;
}
 60; }
}

关于
伊姆兰
评论会员:海梅奥利瓦雷斯 时间:2011/12/14
嗨,
我认为你最好的机会是不使用的DisplayMember,并实施一个toString()重写方法内EntityState:

public class EntityState

{

      private string _text;

 

      public override string ToString()

      {

          return _text;

      }

 

      // etcetera


最好的问候,
海梅
评论会员:会员1622397 时间:2011/12/14
它会很酷支持淡入放大器;淡出,而鼠标悬停,就像在Vista上的共同控制。
评论会员:会员1622397 时间:2011/12/14
它会很酷,支持淡入淡出,而鼠标悬停,就像在Vista上的共同控制。
评论会员:海梅奥利瓦雷斯 时间:2011/12/14
嗨,我不知道该怎么做,但我会进行调查。

最好的问候,
海梅
评论会员:。silver_fish 时间:2011/12/14
要求是,有6个单选按钮和一个ListBox。
当我点击单选按钮,设置一些值获取填充到从数据库中的列表框,但是当我点击在六国之间的单选按钮,从ListBox中的第二个项目必须拆除。有人plese给我一些想法,并帮助我完成代码。 {S2}
评论会员:k_hammami2005 时间:2011/12/14
"plz帮助!"这个简单,不值得一线程??

ROFLOLMFAO
评论会员:rkousha 时间:2011/12/14
良好的控制

评论会员:海梅奥利瓦雷斯 时间:2011/12/14
喜杰米,

在您的实现单选按钮的约束取决于列表项的界限。但是绑定列表项不会改变字体大小的变化。你要设置的ItemHeight FontHeight相同。我添加的OnFontChange事件处理程序,实现这一目标。

保护覆盖无效OnFontChanged(级E)
{

base.OnFontChanged(E); &# 160; this.ItemHeight = FontHeight;
 0; }

还可以设置的单选按钮,并文本之间的差距从
使用的字形大小
  ; RadioButtonRenderer::。GetGlyphSize宽度(E ->图形,州)
RadioButtonRenderer::。GetGlyphSize(E ->图形,州)高

使用字体的高度是相当不适当的,因为字形的大小是恒定的。如果你知道一种方法来改变单选按钮的大小,我想知道。标准单选按钮大小保持不变,不管什么字体大小没有改变按钮的大小的财产。

总体而言,你已经做了很多工作。坚持做下去。感谢。
拉敏
评论会员:shri_khamitkar 时间:2011/12/14
信息拉敏
感谢。 其实我并没有试图改变字体。
我会检讨这方面,并在下次更新发布。欢呼声,海梅。
评论会员:PeterDP 时间:2011/12/14
真的很好的解决方案..

感谢和问候,
Shrikant Khamitkar
评论会员:PeterDP 时间:2011/12/14
如果你绑定一个DataTable的控制,你会看到,而不是需要的列项时字符串"System.Data.DataRowView"

我建议:{ BR} =新的Rectangle(2 e.Bounds.X大小,e.Bounds.Y,e.Bounds.Width大小2,e.Bounds.Height);

边界(this.的DisplayMember!= NULL)/ /绑定的DataTable?然后显示列写的DisplayMember
e.Graphics.DrawString(((System.Data.DataRowView)this.Items [e.Index])[this.DisplayMember]的ToString()。 e.Font,textBrush,边界,this.Align);其他

e.Graphics.DrawString(this.Items [e.Index]的ToString(),E.字体,textBrush,边界,this.Align);



边界=新的Rectangle(e.Bounds.X大小2,e.Bounds.Y,E. Bounds.Width大小- 2,e.Bounds.Height);
e.Graphics.DrawString(this.Items [e.Index]的ToString(),e.​​Font,textBrush,界限,this.Align);



最好的问候,
彼得
评论会员:stephpms 时间:2011/12/14
我忘了:如果绑定数据集,而不是一个DataTable,你可以分割点的DisplayMember ,依此类推。

的问候,

彼得
评论会员:DEGT 时间:2011/12/14
当您使用ControlPaint.DrawRadioButton绘制单选按钮,单选按钮没有良好的作风WindowsXP的或Vista
您可以使用RadioButtonRenderer类,您的单选按钮,将是很好的。为您的RadioListBox类的两个静态方法GetGlyphSize和DrawRadioButton RadioButtonRenderer类将有用。
评论会员:海梅奥利瓦雷斯 时间:2011/12/14
你如何改变你的样品Windows窗体的外观?

http://www.FocusOnPanama.com/
http://www.coralys.com/
http://flightsim.coralys.com/
评论会员:DEGT 时间:2011/12/14
我不知道你指的是什么。
截图是从我的运行Windows Vista的PC。它看起来与Windows XP或其他操作系统不同。
欢呼声,
海梅。
评论会员:Oldek 时间:2011/12/14
这正是whatI的意思。我不有Vista还可能不会很长一段时间。

http://www.FocusOnPanama.com/
http://www.coralys.com/
http://flightsim.coralys.com/
评论会员:鲁道夫月Heijink 时间:2011/12/14
好,首先我加入到程序中的VB,并得到了一些错误,但我无法弄清楚如何添加。 RadioListBox到我的工程案例,这似乎是错误的方式来解决呢?

例如,如果我改变生成操作内容我没有错误,但我仍然不能把它添加到我的工程案例,所以我不知道我如何把它添加

感谢