很少寫WinForm程序第一次使用ListBox控件就遇到了比較惡心的問題。因為我不想手 動綁定ListBox中的Item就使用了DataSource,但是當我進行一些添加、刪除操作時就報 了這個錯“設置DataSource屬性後無法修改項集合”。實在太惡心了,不知道 設計ListBox的人是怎麼想的給了DataSource屬性卻不能隨便更改,而我要實現在一個 ListBox中選中幾項然後放到另一個ListBox中的功能,不能用DataSource的話太麻煩了。 上博客園查了下沒有找到解決辦法,只能自己動手豐衣足食了。
因為有人說引起這個的原因是“在winForm程序中這樣綁定之後是直接和數據源 DataTable相關,改動項會對DataTable造成影響”既然這樣那解決方法就是如果要 對Items做更改就從新弄個DataSource重新綁定,試驗後效果不錯。我把操作兩個ListBox 之間互相移動item的操作封裝到一個類裡,代碼如下:
說明一下,這裡必須用泛型來指明所綁定的對象類型,一開始沒想用泛型的,可是轉 移幾次以後就不能按照DisplayerMember屬性設置的字段來顯示了比較奇怪。希望對遇到 相同問題的朋友有幫助。
經熱心網友提醒,加入了對DataTable的支持。為了便於編碼和統一調用使用 DataTable做數據源時泛型參數為DataRow,新代碼如下:
view plaincopy to clipboardprint?
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
namespace Lucifer
{
//用於統一處理兩個List類型控件之間互相轉移Items
public static class LstCtrlMove_Mgr<T></T>
{
//從一個ListBox中刪除Items
public static void RemoveItems(ListBox lstBox, IEnumerable items)
{
if (typeof(T) == typeof(DataRow))
{
DataTable dt = ((DataTable)lstBox.DataSource);
DataTable newDt = dt.Clone();
bool flag = false;
//因為直接刪除DataRow會保存,所以用這樣丑陋的方式處理了
foreach (DataRow dr in dt.Rows)
{
foreach (DataRowView item in items)
{
if (dr == item.Row)
{
flag = true;
break;
}
else
flag = false;
}
if (!flag)
newDt.Rows.Add(dr.ItemArray);
else
continue;
}
lstBox.DataSource = newDt;
}
else
{
List<T></T> lst = new List<T></T> ();
lst.AddRange((List<T></T>)lstBox.DataSource);
lst.RemoveAll(delegate(T item1)
{
foreach (T item2 in items)
{
if (item1.Equals(item2))
return true;
}
return false;
});
lstBox.DataSource = lst;
}
}
//向一個ListBox中添加Items
public static void AddItems(ListBox lstBox, IEnumerable items)
{
if (typeof(T) == typeof(DataRow))
{
DataTable dt = null;
foreach (object item in items)
{
if(item is DataRowView)
dt = ((DataRowView)item).Row.Table.Clone();
if (item is DataRow)
dt = ((DataRow)item).Table.Clone();
break;
}
if (lstBox.DataSource != null)
dt = ((DataTable)lstBox.DataSource).Copy();
foreach (object item in items)
{
if(item is DataRowView)
dt.Rows.Add(((DataRowView)item).Row.ItemArray);
if (item is DataRow)
dt.Rows.Add(((DataRow)item).ItemArray);
}
lstBox.DataSource = dt;
}
else
{
List<T></T> lst = new List<T></T> ();
if (lstBox.DataSource != null)
lst.AddRange((List<T></T>) lstBox.DataSource);
foreach (T item in items)
{
lst.Add(item);
}
lstBox.DataSource = lst;
}
}
//將ListBox1的選定項轉移到ListBox2中,並從ListBox1中去除
public static void Move(ListBox lstBox1, ListBox lstBox2)
{
if (lstBox1.SelectedItems.Count > 0)
{
AddItems(lstBox2, lstBox1.SelectedItems);
RemoveItems(lstBox1, lstBox1.SelectedItems);
}
}
//將整個lstBox1的項轉移到ListBox2中,並清空ListBox1
public static void MoveAll(ListBox lstBox1, ListBox lstBox2)
{
if (typeof(T) == typeof(DataRow))
{
DataTable dt = (DataTable)lstBox1.DataSource;
AddItems(lstBox2, dt.Rows);
lstBox1.DataSource = dt.Clone();
}
else
{
AddItems(lstBox2, (List<T></T>) lstBox1.DataSource);
lstBox1.DataSource = new List<T></T>();
}
}
}
}