1. 程式人生 > >Winform裡實現一個雙擊ListBox可以切換為TextBox編輯的效果

Winform裡實現一個雙擊ListBox可以切換為TextBox編輯的效果

      在Winform窗體上我們有時候會使用ListBox來展示資料,但是有時候我們希望能對ListBox裡的資料進行編輯。通常我們可能會採用雙擊ListBox的Item後彈出一個InputBox來實現,不過我希望能來的直接一點,正如我標題上說的,雙擊ListBox後,將ListBox整個切換為TextBox,原來的ListBox裡的文字在TextBox裡通過換行顯示。最終得到的效果如下面的GIF動圖。

      1

      我寫了一個ListBoxEditor的類,類程式碼如下所示。其主要是監聽ListBox的雙擊滑鼠事件,建立一個文字框控制元件,將ListBox控制元件的Item字串值寫入TextBox中。在文字框中雙擊或者文字框失去焦點時,重新切換為ListBox控制元件。

ListBoxEditor.cs

public class ListBoxEditor
{
    public ListBoxEditor(ListBox listBox,string itemSplitter=";") { ListBox = listBox; ItemSplitter = itemSplitter; }

    private ListBox _listBox;
    public ListBox ListBox {
        get { return _listBox; }
        set {
            _listBox 
= value; if (_listBox != null) { _listBox.MouseDoubleClick += ListBoxMouseDoubleClick; } } } private string _itemSplitter; public string ItemSplitter { get { return _itemSplitter; } set { _itemSplitter = value; } }
private TextBox _txtBox; private void ListBoxMouseDoubleClick(object sender, MouseEventArgs e) { if (_txtBox == null){ _txtBox = new TextBox(); } string str = null; for (int i = 0; i < ListBox.Items.Count; i++) { if (i == 0) { str = ListBox.Items[i].ToString(); } else { str += ItemSplitter + ListBox.Items[i].ToString(); } } _txtBox.Font = ListBox.Font; _txtBox.Multiline = true; _txtBox.WordWrap = true; _txtBox.ScrollBars = ScrollBars.Vertical; _txtBox.Text = str; ListBox.Parent.Controls.Add(_txtBox); _txtBox.Location = ListBox.Location; _txtBox.Size = ListBox.Size; _txtBox.Visible = true; _txtBox.BringToFront(); _txtBox.LostFocus += TextBoxLostFocus; _txtBox.MouseDoubleClick += TextBoxMouseDoubleClick; _txtBox.Focus(); } private void TextBoxMouseDoubleClick(object sender, MouseEventArgs e) { CloseTextBox(); } private void TextBoxLostFocus(object sender, EventArgs e) { CloseTextBox(); } private void CloseTextBox() { string[] strs = Regex.Split(_txtBox.Text, ItemSplitter, RegexOptions.IgnoreCase); ListBox.DataSource = null; if (strs != null && strs.Count() > 0) { ListBox.DataSource= strs; } ListBox.Parent.Controls.Remove(_txtBox); _txtBox = null; } }

      使用方法:在需要實現ListBox雙擊使用文字框進行編輯的窗體中,使用如下的程式碼來啟用功能:

public frmSysSetting()
{
    InitializeComponent();
    editor = new ListBoxEditor(lstMailTo, Environment.NewLine);//為收件人列表框初始化一個編輯器,分隔符為換行符
}