2009-07-23 56 views
2

這是我的問題: 我有一個DataGridView綁定到自定義對象的BindingList。後臺線程不斷更新這些對象的值。 udpates顯示正確,除了一件事以外,一切都很好 - 如果在更新後臺更新字段時嘗試編輯其他字段,則會丟失輸入的值。下面是展示此行爲的代碼示例: (新形式,刪除一個新的DataGridView上:)DatagridView丟失當前編輯後臺更新

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     private BindingList<foo> flist; 
     private Thread thrd; 
     private BindingSource b; 
     public Form1() 
     { 
      InitializeComponent(); 
      flist = new BindingList<foo> 
        { 
         new foo(){a =1,b = 1, c=1}, 
         new foo(){a =1,b = 1, c=1}, 
         new foo(){a =1,b = 1, c=1}, 
         new foo(){a =1,b = 1, c=1} 
        }; 
      b = new BindingSource(); 
      b.DataSource = flist; 
      dataGridView1.DataSource = b; 
      thrd = new Thread(new ThreadStart(updPRoc)); 
      thrd.Start(); 

     } 

     private void upd() 
     { 
      flist.ToList().ForEach(f=>f.c++); 
     } 

     private void updPRoc() 
     { 
      while (true) 
      { 
       this.BeginInvoke(new MethodInvoker(upd)); 
       Thread.Sleep(1000); 
      } 
     } 
    } 


    public class foo:INotifyPropertyChanged 
    { 
     private int _c; 
     public int a { get; set; } 
     public int b { get; set; } 
     public int c 
     { 
      get {return _c;} 
      set 
      { 
       _c = value; 
       if (PropertyChanged!= null) 
        PropertyChanged(this,new PropertyChangedEventArgs("c")); 
      } 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 
} 

所以,您可以編輯列a或b,你會看到C列的更新使你失去你的入場。

任何想法讚賞。

+0

更新 - 我已經把那似乎工作解決方法。我刪除了對PropertyChanged的調用,而是在後臺更新代碼中調用DataridView.InvalidateColumn。 雖然不高興。 – user144133 2009-07-24 14:16:54

回答

0

我已經玩了一下你的代碼。看來發生了什麼事情是,只要添加新行,新的「foo」對象就會通過'DataGridView的添加行功能自動添加到BindingList。由於它與集合中的對象一樣有效,因此它的'c'參數將由您實現的線程函數遞增,並且您的輸入更改將丟失,因爲PropertyChangedEvent觸發將導致'DataGridView'刷新。

我的建議是有一個不同的視圖或表單,輸入新對象的信息。然後在OK中,將新的foo對象添加到列表中。這違背了直接從DataGridView添加行的目的,我知道這一點,如果你願意跟我爭論,但你可以在其他地方進行所有的驗證。你想要在UI代碼中進行所有的驗證和校正檢查嗎?你想讓用戶處理「你需要一個數字而不是文字!」消息,而其餘的DataGridView正在更新?可能有點令人沮喪。另外,如果數據要不斷變化,那麼從gridview中可以編輯它的點並不多。你想要一個連接的方法來處理數據源,其中一些是不斷變化的。你可能想重新考慮你如何顯示這些信息,也許讓用戶看到數據並以不同的方式進行編輯。

反正我的5美分。

祝你好運yoni,看到數字變得瘋狂並且我理解你的問題很有趣。

利奧Bruzzaniti

+0

也許我的問題還不夠清楚 - 添加新行時沒有發生問題,但是當您正在更改現有行的列a或b時。此外,列C不可編輯(在我的應用程序中)。鑑於缺乏其他答案,我將假定「此行爲是有意設計的」,並且PropertyChanged事件始終會導致當前數據條目丟失。好消息是,我之前評論中描述的解決方法確實有效。 – user144133 2009-08-05 14:21:50

0

之前保存的datagridview不了了之的分配currentCell屬性,使之失去焦點從小區被編輯