WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题解决方案
在做winform程序開發時,我用DataSource綁定了ListBox中的Item,但是當我進行一些添加、刪除操作時就報了這個錯“設置DataSource屬性后無法修改項集合”。而我要實現在一個ListBox中選中幾項然后放到另一個ListBox中的功能,不能用DataSource的話太麻煩了。有人說引起這個的原因是“在winForm程序中這樣綁定之后是直接和數據源DataTable相關,改動項會對DataTable造成影響”,既然這樣那解決方法就是如果要對Items做更改就從新弄個DataSource重新綁定,試驗后效果不錯。我把操作兩個ListBox之間互相移動item的操作封裝到一個類里,代碼如下:
說明一下,這里必須用泛型來指明所綁定的對象類型,一開始沒想用泛型的,可是轉移幾次以后就不能按照DisplayerMember屬性設置的字段來顯示了比較奇怪。希望對遇到相同問題的朋友有幫助。
本程序加入了對DataTable的支持。為了便于編碼和統一調用使用DataTable做數據源時泛型參數為DataRow,新代碼如下:
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>();??
??????????? }?????????? }?????? }?????? }?
本文來自: IT知道網(http://www.itwis.com) 詳細出處參考:http://www.itwis.com/html/net/winform/20080902/2318.html
轉載于:https://www.cnblogs.com/wpf123/archive/2009/04/22/2347481.html
總結
以上是生活随笔為你收集整理的WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最少拦截系统
- 下一篇: 博主的办公室和他的工作台