C# 列表选择控件之ListBox

    ListBox控件用于显示一个项列表,用于选择一项或者多项.

    1. 添加列表项

        使用AddRange()方法:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxItems();
        }

        private void SetListBoxItems()
        {
            this.listBox1.Items.AddRange(new String[]{"1000","1500","2000"});
        }
    }

        使用Add()方法:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxItems();
        }

        private void SetListBoxItems()
        {
            this.listBox1.Items.Add("1000");
            this.listBox1.Items.Add("1500");
            this.listBox1.Items.Add("2000");
        }
    }

        使用Insert()方法

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxItems();
        }

        private void SetListBoxItems()
        {
            this.listBox1.Items.Insert(0, "1000"); //这里的0作为index不能省略
            this.listBox1.Items.Insert(1, "2000");
            this.listBox1.Items.Insert(1, "1500");
        }
    } 

        上面三种方法的结果都是一样的:

    


    2. 删除列表项目

         使用Remove()方法

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxItems();
        }

        private void SetListBoxItems()
        {
            this.listBox1.Items.AddRange(new String[] { "1000", "1500", "2000" });
            this.listBox1.Items.Remove("1500"); //移除一个对象
        }
} 

使用RemoveAt()方法

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxItems();
        }

        //private void SetListBoxItems()
        //{
        //    this.listBox1.Items.AddRange(new String[] { "1000", "1500", "2000" });
        //    this.listBox1.Items.Remove("1500");
        //}

        private void SetListBoxItems()
        {
            this.listBox1.Items.Add("1000");
            this.listBox1.Items.Add("1500");
            this.listBox1.Items.Add("2000");
            this.listBox1.Items.RemoveAt(1); //移除指定下标的元素
        }

使用Clear()方法

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxItems();
        }

        private void SetListBoxItems()
        {
            this.listBox1.Items.Insert(0, "1000");
            this.listBox1.Items.Insert(1, "2000");
            this.listBox1.Items.Insert(1, "1500");
            this.listBox1.Items.Clear(); #清空所有列表项
        }
    } 

最后一个是啥都没有,对于前两个的结果:



3. 选项高度和宽度

    IntegralHeight是一个Bool类型值,用来将能显示的项完全显示,而不会显示项的一部分.(无效)

    ItemHeight 是一个int类型值,用来设置项的高度(无效)

    ColumnWidth 设置项的宽度大小,一般如果多列显示的话会出现列宽很大,此时可以用此属性调整

    PreferredHeight 设置项的最合适的高度,使得所有的项都能显示出来.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxHeight();
        }

        private void SetListBoxHeight()
        {
            this.listBox1.Items.Insert(0, "1000");
            this.listBox1.Items.Insert(1, "2000");
            this.listBox1.Items.Insert(2, "1500");
            this.listBox1.Items.Insert(3, "1000");
            this.listBox1.Items.Insert(4, "2000");
            this.listBox1.Items.Insert(5, "1500");
            this.listBox1.Items.Insert(6, "1000");
            this.listBox1.Items.Insert(7, "2000");
            this.listBox1.Items.Insert(8, "1500"); //项加多一点 看上去直观
            this.listBox1.Items.Insert(9,this.listBox1.CreateGraphics()
                .MeasureString(this.listBox1.Items[0].ToString(), this.listBox1.Font).Width); //这是获取项的宽度
            this.listBox1.Items.Insert(10, this.listBox1.CreateGraphics()
                .MeasureString(this.listBox1.Items[0].ToString(), this.listBox1.Font).Height);//这是获取项的高度
            this.listBox1.Height = this.listBox1.PreferredHeight; //设置最佳高度,使得所有项都显示出来
        }
    }

在上面代码最后加上this.listBox1.MultiColumn=true则允许多列显示,结果如下:



4. 多选

    Listbox支持SelectionMode枚举类型的选择,其中None无法进行选择,One最多选择一项,MultiSimple多选,但是不支持Shift和方向键,MultiSimple多选且支持Shift和方向键

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxSelectionMode();
        }

        private void SetListBoxSelectionMode()
        {
            this.listBox1.SelectionMode = SelectionMode.MultiExtended;//支持多选,且支持Shift和方向键
            this.listBox1.Items.Add("第一个节点");
            this.listBox1.Items.Add("第二个节点");
            this.listBox1.Items.Add("第三个节点");
            this.listBox1.Items.Add("第四个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Items.Add("第六个节点");
            this.listBox1.Items.Add("第七个节点");
            this.listBox1.Items.Add("第八个节点");
            this.listBox1.Items.Add("第九个节点");
            this.listBox1.Items.Add("第十个节点");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            String message = "";
            for (int i = 0; i < this.listBox1.SelectedItems.Count;i++ )
            {
                message = message + "所选节点的索引号是: " + this.listBox1.SelectedIndices[i] +
                    "\n" + "所选节点的内容是: " + this.listBox1.SelectedItems[i].ToString() + "\n";
            }
            MessageBox.Show(message);
        }
    }


5. 滚动条

    HorizontalScrollbar属性来表示控件是否显示滚动条,ScrollAlwaysVisible属性设置滚动条是否总显示, HorizontalExtent属性定义或者获取水平滚动条的宽度

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxSelectionMode();
            SetListBoxScrollbar();
        }

        private void SetListBoxSelectionMode()
        {
            this.listBox1.SelectionMode = SelectionMode.MultiExtended;//支持多选
            this.listBox1.Items.Add("第一个节点");
            this.listBox1.Items.Add("第二个节点");
            this.listBox1.Items.Add("第三个节点");
            this.listBox1.Items.Add("第四个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Items.Add("第六个节点");
            this.listBox1.Items.Add("第七个节点");
            this.listBox1.Items.Add("第八个节点");
            this.listBox1.Items.Add("第九个节点");
            this.listBox1.Items.Add("第十个节点");
        }

        private void SetListBoxScrollbar()
        {
            this.listBox1.HorizontalScrollbar = true;  //这一句是如果超出大小则显示水平滚动条,所以一般看不到
            this.listBox1.ScrollAlwaysVisible = true; //这一句使得水平滚动条都会显示出来
            this.listBox1.HorizontlExtent=this.listBox1.ColumnWidth*5;// 无效,理论上这样的话多列显示的时候最多显示5列
        }

        private void button1_Click(object sender, EventArgs e)
        {
            String message = "";
            for (int i = 0; i < this.listBox1.SelectedItems.Count;i++ )
            {
                message = message + "所选节点的索引号是: " + this.listBox1.SelectedIndices[i] +
                    "\n" + "所选节点的内容是: " + this.listBox1.SelectedItems[i].ToString() + "\n";
            }
            MessageBox.Show(message);
        }
    }


6. Index

       TopIndex启动界面的时候第一个显示的项是原给列表集合中的第TopIndex项,前TopIndex被隐藏在上面,用垂直滚动条查看.(无效)

        SelectedIndex单选属性 用于获取选择项的索引值等价于多选中SelectedIndices[k]


 7. 排序

    使用Sotred属性,设置列表是否按照字典排序

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxSelectionMode();
        }

        private void SetListBoxSelectionMode()
        {
            this.listBox1.SelectionMode = SelectionMode.MultiExtended;//支持多选
            this.listBox1.Items.Add("第一个节点");
            this.listBox1.Items.Add("第三个节点");
            this.listBox1.Items.Add("第二个节点");
            this.listBox1.Items.Add("第七个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Items.Add("第八个节点");
            this.listBox1.Items.Add("第十个节点");
            this.listBox1.Items.Add("第四个节点");
            this.listBox1.Items.Add("第九个节点");
            this.listBox1.Items.Add("第六个节点");
            this.listBox1.Sorted = true; 
        }
    }


结果是按照音标进行排序的


8. 刷新

    一般而言,对于新加的列表项,会每次进行自动刷新界面,这样不仅占用资源而且程序不稳定.当使用BeginUpdate()方法时候可以防止控件的绘图功能,EndUpdate()则可以重新开始控件绘图.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            AddItemToListBox();
        }

        private void AddItemToListBox()
        {
            this.listBox1.BeginUpdate(); //这里指定listBox1不再绘图
            for (int i = 0; i < 1000;i++ )
            {
                this.listBox1.Items.Add("项" + i.ToString());
            }  //所以这里加项实际上不显示
            this.listBox1.EndUpdate();  //到这里一下显示所有已经加的项
        }
    }


9. 查找

    FindString()方法用来查找ListBox控件中以指定字符串相匹配的项

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxSelectionMode();
        }

        private void SetListBoxSelectionMode()
        {
            this.listBox1.SelectionMode = SelectionMode.MultiExtended;//支持多选
            this.listBox1.Items.Add("第一个节点");
            this.listBox1.Items.Add("第三个节点");
            this.listBox1.Items.Add("第二个节点");
            this.listBox1.Items.Add("第七个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Items.Add("第八个节点");
            this.listBox1.Items.Add("第十个节点");
            this.listBox1.Items.Add("第四个节点");
            this.listBox1.Items.Add("第九个节点");
            this.listBox1.Items.Add("第六个节点");
            this.listBox1.Sorted = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string searchText = this.txtFind.Text;
            if (searchText != null && searchText != "")
            {
                int index = this.listBox1.FindString(searchText);
                if (index != -1)
                {
                    this.listBox1.SetSelected(index, true); //设置第index的项为选中状态,false为不选中
                    MessageBox.Show("在ListBox控件中的" + index.ToString() + "项具有" +
                        searchText + "字符串");
                }
                else
                {
                    MessageBox.Show("在ListBox控件中没有匹配的项");
                }
            }
        }
    }

如果有多个满足条件,则选择首先匹配到的项

还有一个重载方式是FindString(string,int)是从指定下标索引int的地方开始查找,其余和上面类似

另外上面的方法不能区分大小写,如果要区分则要求使用方法FindStringExact()方法


10. 其他常用方法

    GetItemHeight() 获取指定项的高度

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxSelectionMode();
        }

        private void SetListBoxSelectionMode()
        {
            this.listBox1.SelectionMode = SelectionMode.MultiExtended;//支持多选
            this.listBox1.Items.Add("第一个节点");
            this.listBox1.Items.Add("第三个节点");
            this.listBox1.Items.Add("第二个节点");
            this.listBox1.Items.Add("第七个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Items.Add("第八个节点");
            this.listBox1.Items.Add("第十个节点");
            this.listBox1.Items.Add("第四个节点");
            this.listBox1.Items.Add("第九个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Sorted = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int itemHeight = 0;
            int sumHeight = 0;
            int itemCount = 0;

            itemCount = this.listBox1.Items.Count;

            for (int i = 0; i < itemCount;i++ )
            {
                itemHeight = this.listBox1.GetItemHeight(i); //获取指定下标i的项高度
                sumHeight += itemHeight;
            }
            MessageBox.Show("所有项的高度总和为: " + sumHeight);
        }
    }

SetItemsCore() 该方法传入一些项的数组,首先清空原有的项然后将传入的数组项设置起来.(无效)

ClearSelected() 该方法清空所有选中的项,设为未选中

GetSelected() 方法获取指定的项是否是选中状态

SetSelected() 方法设置指定的项为选中或者非选中状态

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetListBoxSelectionMode();
        }

        private void SetListBoxSelectionMode()
        {
            this.listBox1.SelectionMode = SelectionMode.MultiExtended;//支持多选
            this.listBox1.Items.Add("第一个节点");
            this.listBox1.Items.Add("第三个节点");
            this.listBox1.Items.Add("第二个节点");
            this.listBox1.Items.Add("第七个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Items.Add("第八个节点");
            this.listBox1.Items.Add("第十个节点");
            this.listBox1.Items.Add("第四个节点");
            this.listBox1.Items.Add("第九个节点");
            this.listBox1.Items.Add("第五个节点");
            this.listBox1.Sorted = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int itemCount = this.listBox1.Items.Count;
            for (int i = 0; i < itemCount;i++ )
            {
                bool isSelected = this.listBox1.GetSelected(i);
                this.listBox1.SetSelected(i,!isSelected); //实现反选
            }
        }
    }

          



猜你喜欢

转载自blog.csdn.net/whitenigt/article/details/80214014