• 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);//为收件人列表框初始化一个编辑器,分隔符为换行符
    }
  • 相关阅读:
    [C++] 用Xcode来写C++程序[5] 函数的重载与模板
    【转】字符编码详解——彻底理解掌握编码知识,“乱码”不复存在
    【转】无法将notepad++添加到打开方式列表中的解决办法
    【转】关于启用 HTTPS 的一些经验分享
    【转】GPU 与CPU的作用协调,工作流程、GPU整合到CPU得好处
    【转】excel 末尾是0 恢复数据方法
    【转】怎么让VS2015编写的程序在XP中顺利运行
    【转】深入 Docker:容器和镜像
    【转】SSL/TLS协议运行机制的概述
    【转】C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.
  • 原文地址:https://www.cnblogs.com/alexywt/p/9967311.html
Copyright © 2020-2023  润新知