一直都在做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("请选择");
});
}
怎么样,代码是不是足够简洁和优雅?基本上可以达到预期的效果了,大家可以根据自己的需求稍做修改。有任何问题和疑问可以留言告诉我!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用