2009-11-02 62 views
1

我有一個DataGridView的表單,其中DataSource是一個表的BindingSource。這個視圖將有一個單行選擇和一個按鈕來刪除,編輯當前選定的行在一個彈出式窗體和一個插入按鈕,也將使用相同的窗體。與DatagridView同步WinForm

我的問題是如何同步彈出窗體與當前行?

我嘗試使用RowStateChanged事件來獲取和存儲當前選中的行,在窗體中使用,但我coudnt。事件發生後,我得到之前選擇的行。

其他的東西我還不明白在C#中如何擁有一個記錄集並且知道哪些是當前記錄,即使它是一種新的插入方式,一旦在表單中輸入所有數據將顯示在相同時間在DataGridView中。

回答

1

您不必將窗體與當前行同步。這就是BindingSource的用途。

當您對BindingSource進行簡單綁定時,每次當前項目發生更改時,綁定控件都會更新,並且每當綁定控件中的值發生更改時,綁定項目中的基礎值就會更新。當您執行復雜綁定時(即綁定控件顯示BindingSource的列表,而不僅僅是當前項目),在BindingSource上更改Position也會更改綁定控件中的當前位置,反之亦然。因此,在這種情況下,您希望使用簡單的綁定綁定第二個窗體上的控件,並在第一個窗體上使用複雜綁定綁定第一個窗體上的控件。

您需要做的唯一不尋常的事情是確保兩種表格都使用相同的BindingSource。當您這樣做時,單擊DataGridView中的新行將更新,BindingSource,BindingSource將值從當前綁定項目推送到綁定到它的所有簡單綁定控件。

這很容易實現。假設Form1DataGridView形式,並且Form2是一個與簡單地綁定控件,這樣做:

在Form1:

private BindingSource Source = new BindingSource(); 

Form1_Load(object sender, EventArgs e) 
{ 
    // set Source's DataSource to your DataTable here. 
    mainDataGridView.DataSource = source; 
    // create DataGridView columns and their bindings here. 

    Form2 f2 = new Form2(); 
    f2.TopMost = true; 
    f2.Source = Source; 
    f2.Show(); 
} 

在窗體2:

public BindingSource Source { get; set; } 

public void Form2_Load(object sender, EventArgs e) 
{  
    idTextBox.DataBindings.Add("Text", Source, "id"); 
    descriptionTextBox.DataBindings.Add("Text", Source, "description") 
} 
+0

你明白了,非常感謝。我做了這件事,它工作正常。我只是不知道如何提交我的更改以及我做的測試,新添加的行只是在表單處理後顯示一些值,但是當選擇另一行時,值就存在。 – 2009-11-02 06:59:15

+1

大部分情況下,只要'位置'發生變化,即用戶移動到另一行時,就會執行更改。您可以通過調用'BindingSource'上的'EndEdit'來顯式提交當前行的掛起更改。 (你可以通過調用'CancelEdit'來回滾它們。) 只要添加一個新行,當添加一個新行時,新行中的每一列都會填充其DataColumn中定義的任何DefaultValue '。然後它被添加到列表中,並且任何複雜綁定的控件都會被通知新行存在,並顯示它。 – 2009-11-02 08:55:34

1

您可以輕鬆地保持同步,但不使用BindingSource。

Windows Forms數據綁定建立在幾個最重要的接口之上: IList和IBindingList。第一個負責通過列表中的索引提供對元素的訪問權限(爲了簡化),第二個實際上更加複雜。

IBindingList的 - (這是由BindingSource的實現)具有的方法,以支持:

  • 改變通知
  • 增加新的 「空」 的元件
  • 排序
  • 搜索

的一個對你很重要的當然是改變通知。不幸的是BindingSource沒有實現那一點代碼。你可能會在這裏做兩件事情 - 要麼使用變更通知來實現你的BindingSource版本,要麼試圖混淆DGV和textboxes/comboboxes事件來更新數據。

我個人做了第一個(我可以分享我的代碼)。

「在C#中我還不明白的其他東西如何擁有一個記錄集並知道當前記錄,即使它的新插入的方式,一旦在窗體中輸入所有數據將顯示在同時在DataGridView中。「

每個表單都有一個BindingContext對象,用於存放CurrencyManagers - 每個DataSource對應一個。這樣,綁定到相同數據源的每個控件都知道哪個記錄是當前的。實際上,BindingNavigator所做的是與適當的CurrencyManager進行混合並調用其方法。 (我不知道爲什麼它需要BindingSource而不是最小IList或IBindingList的全部功能)

+0

韓國社交協會kubal爲了答案,但我想我幾乎沒有什麼可以解釋的。我是C#的新手,主要與Java一起工作,並且我記得過去曾使用VB記錄集,我可以簡單地回顧一下數據。 現在看起來像C#使用disconected記錄集,並且在DataGridView中所做的更改需要'手動'更新到數據庫中。 我正在尋找一個簡單的方法來實現這一點,最好只使用RAD界面,但看起來我需要更多地學習,而且我無法看到任何有關它的好的資源來指向最佳實踐。將嘗試做我的功課,但仍然在尋找一個簡單的解決方案。 – 2009-11-02 02:33:12

+0

在某些情況下,您可能想進入'IBindingList'和'BindingContext'和'CurrencyManager'的世界,但保持控件與'DataTable'同步不是其中的一個。 – 2009-11-02 04:25:58