2009-06-09 18 views
3

現狀:C#:如何處理「自我引用」的範圍內的DataGridView表?

在我的數據庫我有哪些記錄可以在同一個表引用其他記錄的表。每條記錄都有一個唯一的數字ID(自動識別柱)和空列IDRef可能包含記錄的ID被引用。現在

,在我的C#Windows窗體應用程序我使用一個DataGridView,以允許用戶編輯表中的記錄。他可以添加,編輯或刪除項目。我有一個類型化的DataSet保存數據和相應的TableAdapter加載從數據庫中的數據,並進行更新。在DataGridView綁定到使用該類型的DataSet作爲數據源的的BindingSource。

對於IDRef列,我添加了一個ComboBox列,它從DataGridView本身的相同BindingSource中填充它的值。這意味着組合框始終與記錄數保持一致。

問題:

我顯示在DataGridView的ID列。當通過點擊進入的DataGridView的相應行添加新行中,ID值自動負值填充。只有在使用TableAdapter保存對數據庫的更改後才計算最終的自動ID值。

現在,當我爲IDRef列下拉組合框時,可以選擇以前存在的記錄(例如101,102等),但是我也可以選擇上次更新後添加的記錄數據庫(例如-1,-2,-3)。

現在:在我使用TableAdapter的Update方法來將更改持久化到數據庫後,這些否定的ID不再存在 - 我引用了不存在的記錄(在我的情況下,這會導致外鍵約束錯誤) 。

解決方案?

我所做的是:

  • 使用第二DataSet和BindingSource的組合框列
  • 添加一個「應用」按鈕,更新的變化使用TableAdapter的數據庫
  • 重新閱讀將數據輸入綁定到ComboBox列的第二個數據集

這確保用戶只能選擇已持久保存到數據庫b的值按下「應用」按鈕。

是否有比使用DataGridView控件處理表內的這種「自引用」更優雅的方式?

編輯:更改標籤,以更好地貼合主題

回答

1

當使用兩個不同的表負ID問題是關係解決了,修改它的屬性,並將其設置爲外鍵與級聯更新。

我希望它可以自引用和工作,但它的棘手。

在一個單獨的說明,我想你應該有一個組合框不同的BindingSource(同一個表)(或結合W/O一的BindingSource)。

注意,你確實有一些可用的其他工具,以及像Adapter.Update(數據行)

+0

是的,目前我確實有對組合第二DataSet和BindingSource的。這很好 - 只有在我可以選擇任何東西之前,我必須按下「應用」按鈕。 這就是爲什麼我想知道是否有一個更優雅的方式。 – 2009-06-09 13:30:41