簡體   English   中英

在不失去當前單元格焦點的情況下更新DataGridView

[英]Update a DataGridView without loosing current cell focus

我的程序分為兩部分:

  1. Windows窗體中的客戶端。
  2. 由WCF制成的服務器,位於遠程Web服務器(IIS)上。

我的許多不同用戶將同時使用該客戶端。

我的客戶端中有很多DataGridView。 這些DataGridView綁定到Web服務提供的對象的(不同)通用列表。

我需要經常刷新那些DataGridView的內容。 我在客戶端上使用一個調用刷新方法的計時器。

但是我的問題是:如果我使用Invalidate(),則只會更新當前顯示行的內容; 如果另一個用途是刪除或添加新對象(行),則當前用戶將看不到它。 如果我通過重新綁定數據來刷新數據,那么當前的選擇將丟失。。。想象一下用戶正在更新數據時的噩夢...(是的,我可以在用戶編輯單元格時停止計時器,並在用戶完成其操作后重啟計時器進行更改,但我希望找到更好的方法!)。

有人看到過類似的問題嗎? 有人有建議嗎?

謝謝

您所描述的是一個分布式系統。 您需要為此類軟件實現鎖定和同步。 當然,您可以忽略它,但結果將是胡扯。

  1. Datagridview應該只在這里閱讀。
  2. 編輯行應在DGV之外進行。 (如果所有對象都不同,那么您將很有趣)
  3. 鎖定消息應發送到服務器,服務器對此進行跟蹤。
  4. 鎖定的對象應該可以為其他用戶讀取。 不寫。
  5. 鎖定對象的超時值必須存在。

抱歉,將其轉交給您,但您的問題比您想象的要大得多。

同意@WozzeC的答案。 數據庫鎖定是首選解決方案。

但是,如果您不能使用鎖定並且不介意對數據庫進行更多訪問,則可以通過在要更新的表中添加一列,並將每行中的列設置為某個唯一的會話ID來模擬鎖定或該用戶嘗試更新/修改該行時的用戶ID。

這要求在用戶選擇要修改的行時進行數據庫訪問,但這具有檢查行是否仍存在於數據庫中的附加好處(即,幾秒鍾前沒有被其他用戶刪除該行)。

當然,由於這不是真正的數據庫鎖定,因此您必須擔心用戶會話終止(即,他們的PC崩潰)而又不釋放他正在修改的行。 在表中添加了“簽出”時間戳列,使您可以允許用戶的鎖定在合理的時間(例如20分鍾)后超時。

同樣,這種方法並非沒有問題,但是可以為您提供您想要實現的目標。

附錄

如果您無法在要修改的表中添加列,則可能必須添加全新的表來存儲用戶偽鎖。 當然,這意味着所有修改表的應用程序都必須配合並且還必須使用偽鎖定表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM