2014-01-07 44 views
1

我很難讓複雜對象數據綁定正常工作。我有一個窗體和1個綁定源的3個DataGridViews。該BindingSource.DataSource是FileMoveProcesses對象和數據成員是FileMoveProcess對象綁定到BindingSource時將新行插入到DataGridView中

public class FileMoveProcesses 
{ 
    public List<FileMoveProcess> Processes { get; set; } 
} 

public class FileMoveProcess 
{ 
    public string Name { get; set; } 
    public bool Disabled { get; set; } 
    public FileMoveProcessDetails SourceDetails { get; set; } 
    public FileMoveProcessDetails DestinationDetails { get; set; } 
} 

有2個具有BindingSource的和數據成員的數據源其他DataGridViews分別SourceDetails和DestinationDetails。如果我已經在xml文件中爲這些詳細信息提供了數據,這可以很好地工作,如下所示。編輯過程正常工作,正如您所期望的,更新序列化。

Here is a pic with data loading and editable

的問題出現時,我嘗試添加一個新的FileMoveProcess。包含FileMoveProcess的最左邊的DataGridView將正確保存,但是當我嘗試在DataGridView中添加SourceDetails和DestinationDetails數據時,它們無法爲新的FileMoveProcess創建FileMoveProcessDetails對象,因此無法寫入xml文件。

Data Failed to be added to the binding source

我錯過了什麼?

TIA

PS的組合框是枚舉數據綁定,以便數據可用於新的項目。

+0

那麼當你填充你的細節網格並按下保存時會發生什麼?當你調試的時候你能看到你的'FileMoveProcessDetails'對象附加到當前的'FileMoveProcess'或者它們是否爲空? – Vland

+0

當Source或Destination Details網格失去焦點時,所有輸入的數據都被清除。 – Tim

+0

更新。我進入了詳細數據網格屬性的DataBinding/Advanced部分,並重置爲綁定下拉列表爲「無」。這消除了焦點丟失時網格被清除的問題。現在,當我點擊保存細節對象爲空。 – Tim

回答

2

我認爲你必須自己將你的新對象添加到bindingSource。我創建了一個簡單版本的項目,只有2個DGV。我還設置了數據源更新模式爲「從不」在我dataGridView2 -> DataBindings -> Advanced

當我寫一個新的FileMoveProcessDetails(在正確的網格)我可以將它保存點擊一個按鈕,調用此代碼:

private void button1_Click(object sender, EventArgs e) 
{ 
    var myCurrentRow = dataGridView2.Rows[dataGridView2.CurrentRow.Index]; 
    var fmpd = myCurrentRow.DataBoundItem; 
    var pp = (FileMoveProcess)processesBindingSource.Current; 
    pp.SourceDetails = (FileMoveProcessDetails)fmpd; 
} 

這是非常原始的...但BindingSource被保存,我不會失去我的新的FileMoveProcessDetails它當我導航到其他FileMoveProcess後面。

+0

謝謝Vland。那就是訣竅。我認爲BindingSource會照顧到這一點。 – Tim

1

我已經遇到了同樣的問題,並且重新設置了所有你需要做的就是在默認構造函數中創建List collecion的新實例。 :)

public class FileMoveProcesses 
{ 
    public FileMoveProcesses() 
    { 
     Processes = new List<FileMoveProcess>(); 
    } 

    public List<FileMoveProcess> Processes { get; set; } 
} 

public class FileMoveProcess 
{ 
    public string Name { get; set; } 
    public bool Disabled { get; set; } 
    public FileMoveProcessDetails SourceDetails { get; set; } 
    public FileMoveProcessDetails DestinationDetails { get; set; } 
} 
+0

打算給你一個+1。這是我之前錯過的並且會有所幫助的。感謝這篇文章。 – Tim

相關問題