程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 解決WinForm下ListBox控件“設置DataSource屬性後無法修改項集合”

解決WinForm下ListBox控件“設置DataSource屬性後無法修改項集合”

編輯:關於C#

很少寫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>();
      }
    }
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved