两个ListBox中的项互相移动及上下移动

本文参考:http://www.cnblogs.com/greatverve/archive/2012/03/27/listbox-add-remove-up-down.html

 

好像CodeProject里有功能非常强大的类似控件,这里没必要用自定义控件。
左右移动就是简单的选择项增加删除,上下移动使用了高级语法,值得一学。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using WinForm = System.Windows.Forms;

public static class ListBoxExtension
{
    public static bool MoveSelectedItems(this WinForm.ListBox listBox, bool isUp, Action noSelectAction)
    {
        if (listBox.SelectedItems.Count > 0)
        {
            return listBox.MoveSelectedItems(isUp);
        }
        else
        {
            noSelectAction();
            return false;
        }
    }

    public static bool MoveSelectedItems(this WinForm.ListBox listBox, bool isUp)
    {
        bool result = true;
        WinForm.ListBox.SelectedIndexCollection indices = listBox.SelectedIndices;
        if (isUp)
        {
            if (listBox.SelectedItems.Count > 0 && indices[0] != 0)
            {
                foreach (int i in indices)
                {
                    result &= MoveSelectedItem(listBox, i, true);
                }
            }
        }
        else
        {
            if (listBox.SelectedItems.Count > 0 && indices[indices.Count - 1] != listBox.Items.Count - 1)
            {
                for (int i = indices.Count - 1; i >= 0; i--)
                {
                    result &= MoveSelectedItem(listBox, indices[i], false);
                }
            }
        }
        return result;
    }

    public static bool MoveSelectedItem(this WinForm.ListBox listBox, bool isUp, Action noSelectAction)
    {
        if (listBox.SelectedItems.Count > 0)
        {
            return MoveSelectedItem(listBox, listBox.SelectedIndex, isUp);
        }
        else
        {
            noSelectAction();
            return false;
        }
    }

    public static bool MoveSelectedItem(this WinForm.ListBox listBox, bool isUp)
    {
        return MoveSelectedItem(listBox, listBox.SelectedIndex, isUp);
    }

    private static bool MoveSelectedItem(this WinForm.ListBox listBox, int selectedIndex, bool isUp)
    {
        if (selectedIndex != (isUp ? 0 : listBox.Items.Count - 1))
        {
            object current = listBox.Items[selectedIndex];
            int insertAt = selectedIndex + (isUp ? -1 : 1);

            listBox.Items.RemoveAt(selectedIndex);
            listBox.Items.Insert(insertAt, current);
            listBox.SelectedIndex = insertAt;
            return true;
        }
        return false;
    }
}

这个类大概看了看,写得很棒。不管了,只管用。

public partial class FrmReportSet : Form
{
    public FrmReportSet()
    {
        InitializeComponent();
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        List<Object> listObj = new List<object>();
        foreach (Object obj in lboxCanUse.SelectedItems)
        {
            lboxSelected.Items.Add(obj);
            listObj.Add(obj);
        }
        foreach (Object obj in listObj)
        {
            lboxCanUse.Items.Remove(obj);
        }
    }

    private void btnRemove_Click(object sender, EventArgs e)
    {
        List<Object> listObj = new List<object>();
        foreach (Object obj in lboxSelected.SelectedItems)
        {
            lboxCanUse.Items.Add(obj);
            listObj.Add(obj);
        }
        foreach (Object obj in listObj)
        {
            lboxSelected.Items.Remove(obj);
        }
    }

    private void btnUp_Click(object sender, EventArgs e)
    {
        this.lboxSelected.MoveSelectedItems(true, () =>
        {
            MessageBox.Show("请选择");
        });
    }

    private void btnDown_Click(object sender, EventArgs e)
    {
        this.lboxSelected.MoveSelectedItems(false, () =>
        {
            MessageBox.Show("请选择");
        });
    }
}

时间: 2024-09-12 15:43:06

两个ListBox中的项互相移动及上下移动的相关文章

vb.net中如何根据listbox中的项 在对应的数据表中选出相应的记录

问题描述 根据listbox中的项在表中选出记录 解决方案 解决方案二:根据listbox中的项目构造查询:...sql="select*fromtablenamewherename='"+listbox1.Text+"'";...解决方案三:...sql="select*fromtablenamewherename='"Me.ListBox1.SelectedItem.ToString"'"...解决方案四:引用2楼wuji

使用javascript实现两个listbox中list的移动

javascript 效果图片: 说明:1.ListBox为服务器端控件,list可以在服务器端初始化2.Button可以为服务器端,也可以为客户端控件:    如果为服务器端控件,需要在页面初始化的时候为其添加事件处理为:    btn_updaddrel.Attributes.Add("OnClick","javascript:add();");     如果为客户端控件,则在声明控件的时候指定事件处理: <INPUT type="button&

两个listbox互相之间相互移动

问题描述 两个listbox互相之间相互移动 两个listbox互相之间相互移动,分为全部移动,移动当前条目和全部还原三个功能的实现? 解决方案 http://www.cnblogs.com/greatverve/archive/2012/03/27/listbox-add-remove-up-down.html 解决方案二: 两个ListBox中的项互相移动及上下移动

c# listbox 转移-C# listbox控件 两个listbox间item的转移

问题描述 C# listbox控件 两个listbox间item的转移 第一段代码: protected void Button1_Click(object sender, EventArgs e) { for (int i = 0; i < selected.Items.Count; i++) { if (selected.Items[i].Selected) { select.Items.Add(selected.SelectedItem); selected.Items.Remove(se

a.sp.net清除ListBox的列表项(删除所有项目)_实用技巧

如何清除ListBox的列表项(删除所有项目), 今天开发程序时,有尝试使用此功能.一开始并不是很顺利.循环所有item去做remove时,需要执行两次才可以完成清除.debug进行步进跟踪,发现在Listbox.Items.Count 每移除一个,Count随之减少,而Capacity并没有作相应变化. 在网上搜索相关资料,相当多用户有相同要求,一次移除ListBox的列表所有项.方法均是用: 复制代码 代码如下: for (int i = 0; i < Listbox1.Items.Coun

两个listbox实现选项的添加删除和搜索_javascript技巧

两个listbox实现选项的添加,删除和搜索 贴一下主要的js代码,一些资源我就不传了.下面是效果图. group.js 复制代码 代码如下: function addMember() { //右侧选中的项添加到左侧 var add=$("#newAddMembersId").val(); var del=$("#deleteMembersId").val(); var ext=$("#existedMemberId").val(); var n

如何实现动态添加Html文档中Form项

大家好,今天和大家谈谈如何用ASP来实现动态的添加Html文档中Form项的问题.如果你对Html比较熟悉的话肯定知道有个<form></form>的HTML标记.在<form>与</form>之间有诸如类型(type)为Text.Password.Button.Submit.Reset等的标记(元素).我们这里所说的动态的添加Form项就是指动态的添加<Form></Form>中的Text元素.那么如何去实现动态的添加Form项呢?

JS往数组中添加项性能分析

这篇文章主要介绍了JS往数组中添加项性能分析的相关资料,需要的朋友可以参考下 比较了4种可以向数组添加项的方法之间的性能: 使用索引器添加 代码如下: console.time("index"); var a = []; for (var i = 0, l = times; i < l; i++) { a[i] = i; } console.timeEnd("index"); 使用push方法 代码如下: console.time("push&quo

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.5.6 访问目录中的项

2.5.6 访问目录中的项 静态的Files.list方法会返回一个可以读取目录中各个项的Stream对象.目录是被惰性读取的,这使得处理具有大量项的目录可以变得更高效. 因为读取目录涉及需要关闭的系统资源,所以应该使用try块: list方法不会进入子目录.为了处理目录中的所有子目录,需要使用File.walk方法. 下面是加压后的src.zip树的遍历样例: 正如你所见,无论何时,只要遍历的项是目录,那么在进入它之前,会继续访问它的兄弟项. 可以通过调用File.walk(pathToRoo