【代码保留】WinForm ListBox上下移动选中项(扩展)

一直都在做asp.net的东西,WinForm好久没碰过了,近乎陌生。今天同事说他的Winform中的ListBox无法上下移动项,让我感觉好奇怪,怎么可能,不就是交替选项么,换换位置应该就可以搞定。看了同事的代码,只觉得一片混沌,实在不忍心再读下去,就自己操刀写一下了。(下面的代码使用了扩展方法,需要编译器版本>=3.0,也可以根据相关语法自行修改成2.0以下的版本)
代码功能:比较简单,就是当选中ListBox中的项的时候,点击上移按钮,项向上移动,点击下移按钮,项向下移动。
[使用:建立cs文件,并COPY以下代码置于其中,即可按照示例所用的方式进行使用了]

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

        
else
        
{
            noSelectAction();
            
return false;
        }

    }


    
public static bool MoveSelectedItems(this ListBox listBox, bool isUp)
    
{
        
bool result = true;
        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 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 ListBox listBox, bool isUp)
    
{
        
return MoveSelectedItem(listBox, listBox.SelectedIndex, isUp);
    }


    
private static bool MoveSelectedItem(this 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;
    }

}

[示例]

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


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

怎么样,代码是不是足够简洁和优雅?基本上可以达到预期的效果了,大家可以根据自己的需求稍做修改。有任何问题和疑问可以留言告诉我!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值