2009-03-04 55 views
0

對此問題的答案可能會變成「不使用鍵入的數據集而不使用綁定導航器」。 然而,我很好奇我看到的行爲。更改列表框選擇不會將更改從BindingSource移動到數據集

因此,我創建了一個表單,其中每個控件都從數據源瀏覽器中拖出。 我刪除了綁定導航器,因爲它對於這個特殊的表單來說很醜,也不合適。 我添加了一個ListBox並將DataSource設置爲BindingSource。
注意ListBox沒有被綁定,它只是從BindingSource中自己填充。 通過一些我不指望的魔法,在ListBox中移動將瀏覽BindingSource,並且所有其他控件都相應地更新。

我可以對綁定控件進行更改,並顯式調用BindingSource上的EndEdit,然後通過Table Adapter更新DataSource。很棒。

當我在綁定控件中進行更改並單擊列表框中的新選項時,我希望能夠檢查更改並提示保存或重置(如果有)。

這是我一直未能弄清楚的奇怪部分。

無論我附加到什麼事件,DataSet.HasChanges在第二個ListBox更改之前都不會返回true。 我搜索並嘗試了幾十條建議,其中大部分都很荒謬,但有一些看起來很有希望。 沒有運氣。

編輯:這不是第二次點擊是重要的,它是當你點擊原始(編輯)的項目。

回答

0

既然問了這個問題,我已經瞭解了一些關於BindingSources,DataSet和TableAdapter的知識。

這裏是什麼在起作用:

private void MyListBox_Click(object sender, EventArgs e) 
    { 
     this.myBindingSource.EndEdit(); 
     if (myDataSet.HasChanges()) 
     { 
      if (MessageBox.Show("Save changes?", "Before moving on", MessageBoxButtons.YesNo) == DialogResult.Yes) 
      { 
       myTableAdapter.Update(myDataSet.myDataTable); 
      } 
      else 
      { 
       myDataSet.RejectChanges(); 
      } 
     } 
    }