none
listbox多选实现上下移动的问题。 RRS feed

  • 问题

  • 分为三种情况:
    1、选择一项。这种情况简单,可以实现。
    2、选择连续的多项。这种情况也可以实现。
    3、选择不连续的多项。此时选择的项可以是不连续的单项组成和单项及连续的多项组成。(假设listbox中有1、2、3、4、5、6这几个项,可以选择3、5,也可以选择2、4、5)

    请问第三中情况怎么实现?

    2009年6月2日 2:06

答案

  • -------------------------------------------------------------
    -- html
    -------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021128.aspx.cs" Inherits="ListBoxs_X200906021128" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script type="text/javascript">
            function MoveUP(fElement)
            {
                if (fElement.options.length == 0 || fElement.options[0].selected) return;
                for (var i = 1; i < fElement.options.length; i++)
                {
                    if (fElement.options[i].selected)
                    {
                        var text = fElement.options[i].text;
                        var value = fElement.options[i].value;
                        var selected = fElement.options[i].selected;
    
                        fElement.options[i].text = fElement.options[i - 1].text;
                        fElement.options[i].value = fElement.options[i - 1].value;
                        fElement.options[i].selected = fElement.options[i - 1].selected;
                        
                        fElement.options[i - 1].text = text;
                        fElement.options[i - 1].value = value;
                        fElement.options[i - 1].selected = selected;
                    }
                }
            }
    
            function MoveDown(fElement)
            {
                if (fElement.options.length == 0 || fElement.options[fElement.options.length - 1].Selected) return;
                
                for (var i = fElement.options.length - 1; i > -1; i--)
                {
                    if (fElement.options[i].selected)
                    {
                        var text = fElement.options[i + 1].text;
                        var value = fElement.options[i + 1].value;
                        var selected = fElement.options[i + 1].selected;
    
                        fElement.options[i + 1].text = fElement.options[i].text;
                        fElement.options[i + 1].value = fElement.options[i].value;
                        fElement.options[i + 1].selected = fElement.options[i].selected;
    
                        fElement.options[i].text = text;
                        fElement.options[i].value = value;
                        fElement.options[i].selected = selected;
                    }
                }
            }
            
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ListBox ID="fListBox" runat="server" Height="200px" SelectionMode="Multiple" Width="200px"></asp:ListBox>
            <br />
            <br />
            --- Server Side ------------------------------------------------------
            <br />
            <br />
            <asp:Button ID="btnUp" runat="server" onclick="btnUp_Click" Text="Up" />
            <asp:Button ID="btnDown" runat="server" onclick="btnDown_Click" Text="Down" />
            <br />
            <br />
            --- Client Side ------------------------------------------------------
            <br />
            <br />
            <input type="button" value="UP" onclick="MoveUP(document.getElementById('fListBox'));" />
            <input type="button" value="Down" onclick="MoveDown(document.getElementById('fListBox'));" />
            <br />
             用 Ctrl + 鼠标 或 Ctrl + Shift 鼠标,实现多选或间断多选
        </div>
        </form>
    </body>
    </html>
    -------------------------------------------------------------
    -- cs
    -------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ListBoxs_X200906021128 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                for (int i = 0; i < 20; i++)
                    fListBox.Items.Add(i.ToString());
            }
        }
    
        protected void btnUp_Click(object sender, EventArgs e)
        {
            // 没有项,或第一个选中节点已经是第一项,则不处理
            if (this.fListBox.Items.Count == 0 || this.fListBox.Items[0].Selected) return; 
            for (int i = 1; i < this.fListBox.Items.Count; i++)
            {
                if (this.fListBox.Items[i].Selected)
                    this.ChangeProperty(this.fListBox.Items[i - 1], this.fListBox.Items[i]);
            }
        }
    
        protected void btnDown_Click(object sender, EventArgs e)
        {
            // 没有项,或最后一个选中节点已经是第一项,则不处理
            if (this.fListBox.Items.Count == 0 || this.fListBox.Items[this.fListBox.Items.Count - 1].Selected) return;
            for (int i = this.fListBox.Items.Count-1; i >-1 ; i--)
            {
                if (this.fListBox.Items[i].Selected)
                    this.ChangeProperty(this.fListBox.Items[i], this.fListBox.Items[i+1]);
            }
        }
    
        private void ChangeProperty(ListItem fFront, ListItem fCurrent)
        {
            string fText = fFront.Text;
            string fValue = fFront.Value;
            bool fSelected = fFront.Selected;
    
            fFront.Text = fCurrent.Text;
            fFront.Value = fCurrent.Value;
            fFront.Selected = fCurrent.Selected;
    
            fCurrent.Text = fText;
            fCurrent.Value = fValue;
            fCurrent.Selected = fSelected;
        }
    }
    
    



    知识改变命运,奋斗成就人生!
    • 已标记为答案 cnlearner 2009年6月3日 5:36
    2009年6月3日 2:41
    版主

全部回复

  • 用 ctrl + shift 实现不连续的多选,上下移就和第二种的实现方法差不多,一个一个的移,从第一个选择的项开始移动
    知识改变命运,奋斗成就人生!
    2009年6月2日 2:14
    版主
  • 能不能贴段代码。
    我也是想一个一个的移,可是写的时候不行了。
    2009年6月2日 3:23
  • 有这个必要吗? 实在要这个功能可以写个自定义的控件


    蜗牛的长征
    2009年6月2日 3:35
  • ------------------------------------------------------------------------------------------------
    -- HTML
    ------------------------------------------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021128.aspx.cs" Inherits="ListBoxs_X200906021128" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ListBox ID="fListBox" runat="server" Height="200px" SelectionMode="Multiple" Width="200px"></asp:ListBox>
            <br />
            <asp:Button ID="btnUp" runat="server" onclick="btnUp_Click" Text="Up" />
            <asp:Button ID="btnDown" runat="server" onclick="btnDown_Click" Text="Down" />
            <br /> 用 Ctrl + 鼠标 或 Ctrl + Shift 鼠标,实现多选或间断多选
        </div>
        </form>
    </body>
    </html>
    
    
    ------------------------------------------------------------------------------------------------
    -- CS
    ------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ListBoxs_X200906021128 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                for (int i = 0; i < 20; i++)
                    fListBox.Items.Add(i.ToString());
            }
        }
    
        protected void btnUp_Click(object sender, EventArgs e)
        {
            // 没有项,或第一个选中节点已经是第一项,则不处理
            if (this.fListBox.Items.Count == 0 || this.fListBox.Items[0].Selected) return; 
            for (int i = 1; i < this.fListBox.Items.Count; i++)
            {
                if (this.fListBox.Items[i].Selected)
                    this.ChangeProperty(this.fListBox.Items[i - 1], this.fListBox.Items[i]);
            }
        }
    
        protected void btnDown_Click(object sender, EventArgs e)
        {
            // 没有项,或最后一个选中节点已经是第一项,则不处理
            if (this.fListBox.Items.Count == 0 || this.fListBox.Items[this.fListBox.Items.Count - 1].Selected) return;
            for (int i = this.fListBox.Items.Count-1; i >-1 ; i--)
            {
                if (this.fListBox.Items[i].Selected)
                    this.ChangeProperty(this.fListBox.Items[i], this.fListBox.Items[i+1]);
            }
        }
    
        private void ChangeProperty(ListItem fFront, ListItem fCurrent)
        {
            string fText = fFront.Text;
            string fValue = fFront.Value;
            bool fSelected = fFront.Selected;
    
            fFront.Text = fCurrent.Text;
            fFront.Value = fCurrent.Value;
            fFront.Selected = fCurrent.Selected;
    
            fCurrent.Text = fText;
            fCurrent.Value = fValue;
            fCurrent.Selected = fSelected;
        }
    }
    
    


    知识改变命运,奋斗成就人生!
    2009年6月2日 4:09
    版主
  • X.X.Y 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌

    这个是一个一个的移可以
    2009年6月2日 6:07
  • 多选,间断多选都是可以的
    知识改变命运,奋斗成就人生!
    2009年6月2日 6:14
    版主
  • 使用javascript不是很好吗
    【孟子E章】
    2009年6月2日 9:32
    版主
  • 使用javascript不是很好吗
    【孟子E章】

    孟老师,我就是想用javascript,可是只写了1和2两种情况的移动,第三种写不出来。能不能帮我写个示范。谢谢。
    2009年6月3日 2:05
  • -------------------------------------------------------------
    -- html
    -------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021128.aspx.cs" Inherits="ListBoxs_X200906021128" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script type="text/javascript">
            function MoveUP(fElement)
            {
                if (fElement.options.length == 0 || fElement.options[0].selected) return;
                for (var i = 1; i < fElement.options.length; i++)
                {
                    if (fElement.options[i].selected)
                    {
                        var text = fElement.options[i].text;
                        var value = fElement.options[i].value;
                        var selected = fElement.options[i].selected;
    
                        fElement.options[i].text = fElement.options[i - 1].text;
                        fElement.options[i].value = fElement.options[i - 1].value;
                        fElement.options[i].selected = fElement.options[i - 1].selected;
                        
                        fElement.options[i - 1].text = text;
                        fElement.options[i - 1].value = value;
                        fElement.options[i - 1].selected = selected;
                    }
                }
            }
    
            function MoveDown(fElement)
            {
                if (fElement.options.length == 0 || fElement.options[fElement.options.length - 1].Selected) return;
                
                for (var i = fElement.options.length - 1; i > -1; i--)
                {
                    if (fElement.options[i].selected)
                    {
                        var text = fElement.options[i + 1].text;
                        var value = fElement.options[i + 1].value;
                        var selected = fElement.options[i + 1].selected;
    
                        fElement.options[i + 1].text = fElement.options[i].text;
                        fElement.options[i + 1].value = fElement.options[i].value;
                        fElement.options[i + 1].selected = fElement.options[i].selected;
    
                        fElement.options[i].text = text;
                        fElement.options[i].value = value;
                        fElement.options[i].selected = selected;
                    }
                }
            }
            
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ListBox ID="fListBox" runat="server" Height="200px" SelectionMode="Multiple" Width="200px"></asp:ListBox>
            <br />
            <br />
            --- Server Side ------------------------------------------------------
            <br />
            <br />
            <asp:Button ID="btnUp" runat="server" onclick="btnUp_Click" Text="Up" />
            <asp:Button ID="btnDown" runat="server" onclick="btnDown_Click" Text="Down" />
            <br />
            <br />
            --- Client Side ------------------------------------------------------
            <br />
            <br />
            <input type="button" value="UP" onclick="MoveUP(document.getElementById('fListBox'));" />
            <input type="button" value="Down" onclick="MoveDown(document.getElementById('fListBox'));" />
            <br />
             用 Ctrl + 鼠标 或 Ctrl + Shift 鼠标,实现多选或间断多选
        </div>
        </form>
    </body>
    </html>
    -------------------------------------------------------------
    -- cs
    -------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ListBoxs_X200906021128 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                for (int i = 0; i < 20; i++)
                    fListBox.Items.Add(i.ToString());
            }
        }
    
        protected void btnUp_Click(object sender, EventArgs e)
        {
            // 没有项,或第一个选中节点已经是第一项,则不处理
            if (this.fListBox.Items.Count == 0 || this.fListBox.Items[0].Selected) return; 
            for (int i = 1; i < this.fListBox.Items.Count; i++)
            {
                if (this.fListBox.Items[i].Selected)
                    this.ChangeProperty(this.fListBox.Items[i - 1], this.fListBox.Items[i]);
            }
        }
    
        protected void btnDown_Click(object sender, EventArgs e)
        {
            // 没有项,或最后一个选中节点已经是第一项,则不处理
            if (this.fListBox.Items.Count == 0 || this.fListBox.Items[this.fListBox.Items.Count - 1].Selected) return;
            for (int i = this.fListBox.Items.Count-1; i >-1 ; i--)
            {
                if (this.fListBox.Items[i].Selected)
                    this.ChangeProperty(this.fListBox.Items[i], this.fListBox.Items[i+1]);
            }
        }
    
        private void ChangeProperty(ListItem fFront, ListItem fCurrent)
        {
            string fText = fFront.Text;
            string fValue = fFront.Value;
            bool fSelected = fFront.Selected;
    
            fFront.Text = fCurrent.Text;
            fFront.Value = fCurrent.Value;
            fFront.Selected = fCurrent.Selected;
    
            fCurrent.Text = fText;
            fCurrent.Value = fValue;
            fCurrent.Selected = fSelected;
        }
    }
    
    



    知识改变命运,奋斗成就人生!
    • 已标记为答案 cnlearner 2009年6月3日 5:36
    2009年6月3日 2:41
    版主
  • 非常感谢!

    2009年6月3日 5:36