强制移除ComboBox或ListBox中的项,即使是用 DataSource 属性初始化的项集合

        /// <summary>
        /// 强制移除列表控件中的指定项。
        /// 如果列表控件的项,是由 DataSource 属性增加的。
        /// </summary>
        /// <param name="lc">要操作的列表控件</param>
        /// <param name="indexToRemove">
        /// 要移除的项序数,从0开始。
        /// 如果不提供,将会使用 SelectedIndex 属性来填充
        /// </param>
        public static void RemoveItem(ListControl lc, int indexToRemove = -1)
        {
            int iSelected = -1;
            string mDisplay = null;
            object ds = null;

            IList items = null;
            if(lc is ComboBox)
            {
                items = (lc as ComboBox).Items;
            }
            if(lc is ListBox)
            {
                items = (lc as ListBox).Items;
            }
            if(indexToRemove == -1)
            {
                indexToRemove = lc.SelectedIndex;
            }

            if (indexToRemove != -1)
            {
                iSelected = lc.SelectedIndex;
                mDisplay = lc.DisplayMember;

                if (lc.DataSource == null)
                {
                    items.RemoveAt(indexToRemove);
                    MessageBox.Show(lc.SelectedIndex.ToString());
                }
                else
                {
                    ds = lc.DataSource;
                    //此操作,会清空 items
                    lc.DataSource = null;
                    //ListBox/ComboBox 的 Items 是 IList 类型或数组,而数组也实现了 IList 接口
                    IList lst = ds as IList;
                    for(int i = 0; i < lst.Count; i++)
                    {
                        if(i != indexToRemove) 
                            items.Add(lst[i]);
                    }
                }
            }
            if (ds != null)
            {
                if (lc is ComboBox)
                {
                    ComboBox cbb = lc as ComboBox;
                    cbb.DataSource = items;
                    cbb.SelectedIndex = iSelected;
                }
                if (lc is ListBox)
                {
                    ListBox lb = lc as ListBox;
                    lb.DataSource = items;
                    lb.SelectedIndex = iSelected;
                }
                lc.DisplayMember = mDisplay;
            }
        }

 

posted @ 2019-08-08 19:56  nutix  阅读(400)  评论(0编辑  收藏  举报