2009-03-04 27 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(); 
      } 
     } 
    }