2010-06-01 40 views
2

或者,Google可能對我不友好?爲什麼沒有人爲Winforms寫了RadioMenuItems類?

我想是這樣簡單的事情:接受菜單項的對象的數組

  • 構造
  • 價值獲得,將設定好的
  • 綁定了經過性能到所有點擊/設置屬性所提供的項目的事件,並提供一個事件
  • 工作的DataBind設施

如果您遇到這樣一個不錯的東西,請直接指導我。請不要手動做你的form1.cs-class鏈接。這我可以自己做。

回答

2

參見:http://msdn.microsoft.com/en-us/library/ms404318.aspx

總結:你必須作出新的ToolStripMenuItem的子類,覆蓋OnCheckChanged,OnOwnerChanged,以及可能的OnPaint方法。

請注意,在我們的情況下,我們保留UI的複選標記而不是單選按鈕。但保持專有的勾號功能。

1

OKay,這是我的最終代碼。它做另一個不支持(支持綁定)的東西,反之亦然。也許可以合併。盡情享用。

// 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);  
      }  
     }  
    }  
}  
相關問題