一直都在做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("請選擇");
});
}
怎麼樣,代碼是不是足夠簡潔和優雅?基本上可以達到預期的效果了,大家可以根據自己的需求稍做修改。有任何問題和疑問可以留言告訴我!