代码之家  ›  专栏  ›  技术社区  ›  Pavel Radzivilovsky

为什么没有人为Winforms编写RadioMenuItems类?

  •  2
  • Pavel Radzivilovsky  · 技术社区  · 16 年前

    或者谷歌对我不太友好?

    我想要的是一件简单的事情:

    • 值get/set属性,该属性将正确设置所有选中的属性
    • 绑定到所提供项的所有已单击事件并提供一个事件
    • 工作数据绑定设施

    2 回复  |  直到 16 年前
        1
  •  2
  •   Reddog    16 年前

    请参见: http://msdn.microsoft.com/en-us/library/ms404318.aspx

    总结:您必须创建一个新的ToolStripMenuItem子类,该子类重写OnCheckChanged、OnOwnerChanged以及OnPaint方法。

    注意,在本例中,我们保留了UI的复选标记,而不是单选按钮。但保留独家的滴答功能。

        2
  •  1
  •   Artyom    16 年前

    // Usage example:    
    //     
    // ric = new RadioItemCoupler(new ToolStripMenuItem[] {     
    //    neverToolStripMenuItem,     
    //    alwaysToolStripMenuItem,     
    //    errorsOnlyToolStripMenuItem     
    // });    
    // this.Controls.Add(ric);    
    // _ric.DataBindings.Add("CheckedIndex", MySettings, "SmsReplyType",     
    //    false, DataSourceUpdateMode.OnPropertyChanged);    
    
    public class RadioItemCoupler : Control    
    {    
        private int _checkedIndex;    
    
        // Zero-based    
        [Bindable(true)]    
        public int CheckedIndex    
        {    
            get { return _checkedIndex; }    
            set    
            {    
                _checkedIndex = value;    
                _items[value].Checked = true;    
            }    
        }    
    
        public event EventHandler CheckedIndexChanged;    
    
        ToolStripMenuItem[] _items;    
    
        private delegate void ItemHandler(ToolStripMenuItem item);    
    
        public RadioItemCoupler(ToolStripMenuItem[] items)    
        {    
            _items = items;    
    
            foreach (ToolStripMenuItem tsmi in _items)    
            {    
                tsmi.CheckOnClick = true;    
                tsmi.CheckedChanged += new EventHandler(tsmi_CheckedChanged);    
            }    
        }    
    
        void tsmi_CheckedChanged(object sender, EventArgs e)    
        {    
            ToolStripMenuItem that = sender as ToolStripMenuItem;    
    
            // Restore check if checked out    
            bool nothingChecked = true;    
            foreach(var item in _items)    
                nothingChecked = nothingChecked && !item.Checked;    
            if (nothingChecked)    
            {    
                _items[_checkedIndex].Checked = true;    
                return;    
            }    
    
            if (!that.Checked)     
                return;    
    
            for (int i = 0; i < _items.Length; i++)    
            {    
                if (that != _items[i])    
                {    
                    if (_items[i].Checked)    
                        _items[i].Checked = false;    
                }    
                else    
                {    
                    _checkedIndex = i;    
    
                    if (CheckedIndexChanged != null)    
                        CheckedIndexChanged(this, EventArgs.Empty);    
                }    
            }    
        }    
    }    
    
    推荐文章