2012-01-20 70 views
2

這裏的都是事實:家長的DataGridView不更新

  1. 我有一個父表,讓我們稱之爲訂單。使用DataGridView(dgvOrder)查看此表中的數據。
  2. 我有一個子表,我們稱之爲OrderDetails。使用DataGridView(dgvOrderDetails)查看此表中的數據我有文本框(以及複選框,組合框等),它們是Order表(使用BindingSource)的數據綁定。
  3. 我使用Visual Studio 2008

我想要做什麼:

dgvOrder是隻讀的。我用它來瀏覽記錄ala BindingNavigator。 (我喜歡使用DataGridView導航記錄,因爲它很直觀,你會立即看到接下來的幾條記錄是什麼。)

要添加新記錄,我使用「新建」按鈕(uxNewButton)。爲了保存我的更新,我使用了「保存」按鈕(uxSaveButton)。使用文本框添加記錄,而不是直接通過dgvOrder添加。子記錄直接通過dgvOrderDetails添加。

dgvOrderDetails,我想,很明顯 - 它包含訂單的細節(1對多關係)。

我的代碼和配置:

  • Hierchical更新(在DataSet設計器)(在VS 2008中默認情況下)
  • 秩序和的OrderDetail的關係被設定爲「既關係設置爲true和fk約束「。更新和刪除設置爲級聯。接受/拒絕規則設置爲「無」。嵌套關係未選中。
  • TableAdapterManager被拖到設計器(tam)。

    私人無效uxNewButton_Click(對象發件人,EventArgs的){

    bsOrder.AddNew(); 
    

    }

    私人無效uxSaveButton_Click(對象發件人,EventArgs的){

    this.Validate(); 
        bsOrder.EndEdit(); 
        bsOrderDetails.EndEdit(); 
    
        tam.UpdateAll(dsOrder); //DataSet is named dsOrder. try-catch block excluded for simplicity 
    

    }

問題:

填滿所有的文本框(等)和dgvOrderDetails,擊中保存按鈕將導致錯誤後:ForeignKeyConsraint FK_Orderchild_Order要求孩子鍵值(-1)在父表中存在。

但是,如果我直接使用dgvOrder(然後dgvOrderDetails)添加記錄,則點擊保存按鈕將成功保存。

我還發現,如果我使用文本框添加新記錄,但必須在dgvOrder中選擇不同的行,然後在dgvOrderDetails上添加記錄之前再次選擇當前行,才能保存成功。

看起來像通過文本框添加新記錄時,基礎數據不會與DataGridView同步。選擇不同的行,然後選擇返回當前行同時完成數據。

我在像保存事件嘗試了各種黑客:

dgvOrder.Refresh(); //or 

dgvOrder.Invalidate(); 
dgvOrder.Refresh(); // or 

dgvOrder.Parent = null; 
Controls.Add(dgvOrder); 

//and so on and so forth (suggetstions from Google searches) 
+0

我忘記提到在調用tam.UpdateAll()之前通過編程方式移動dgvOrder選項並不能解決問題。 – tonex

+0

在dgvOrderDetail的Enter事件中添加bsOrder.EndEdit()似乎解決了這個問題,但我不確定這是否是最佳實踐。 – tonex

回答

0

添加bsOrder.EndEdit()上的Enter dgvOrderDetail的事件似乎解決了問題,但我不知道這是否是最好的做法。