【代码保留】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;
}
}
{
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("请选择");
});
}
{
this.listBox1.MoveSelectedItems(true, () => {
MessageBox.Show("请选择");
});
}
private void btnDown_Click(object sender, EventArgs e)
{
this.listBox1.MoveSelectedItems(false, () => {
MessageBox.Show("请选择");
});
}
怎么样,代码是不是足够简洁和优雅?基本上可以达到预期的效果了,大家可以根据自己的需求稍做修改。有任何问题和疑问可以留言告诉我!
posted on 2008-05-07 13:46 volnet(可以叫我大V) 阅读(3491) 评论(0) 编辑 收藏 举报