更改 ListBox 选择不会将更改从 BindingSource 移动到 DataSet

Posted

技术标签:

【中文标题】更改 ListBox 选择不会将更改从 BindingSource 移动到 DataSet【英文标题】:Changing ListBox selection is not moving changes from BindingSource to DataSet 【发布时间】:2009-03-04 02:30:45 【问题描述】:

这个问题的答案可能是“不使用绑定导航器就不要使用类型化的数据集”。 不过,我很好奇我看到的行为。

因此,我创建了一个表单,其中每个控件都从数据源资源管理器中拖出。 我删除了 Binding Navigator,因为它丑陋且不适合这种特殊形式。 我添加了一个 ListBox 并将 DataSource 设置为 BindingSource。 请注意,ListBox 未绑定,它只是从 BindingSource 填充自身。 通过一些我没想到的魔法,在 ListBox 中四处移动是在导航 BindingSource,并且所有其他控件都相应地更新。

我可以对绑定的控件进行更改,并在 BindingSource 上显式调用 EndEdit,然后通过 Table Adapter 更新 DataSource。效果很好。

当我在绑定控件中进行更改并单击 ListBox 中的新选项时,我希望能够检查更改并提示保存或重置(如果有)。

这是我无法弄清楚的奇怪部分。

无论我附加到什么事件,DataSet.HasChanges 在第二个 ListBox 更改之前都不会返回 true。 我已经搜索并尝试了几十个建议,其中大多数是荒谬的,但有一些看起来很有希望。 没有运气。

编辑:重要的不是第二次点击,而是当您再次点击原始(已编辑)项目时。

【问题讨论】:

【参考方案1】:

自从提出这个问题后,我对 BindingSources、DataSets 和 TableAdapters 有了更多了解。

以下是有效的:

    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();
            
        
    

【讨论】:

以上是关于更改 ListBox 选择不会将更改从 BindingSource 移动到 DataSet的主要内容,如果未能解决你的问题,请参考以下文章

零元学Expression Blend 4 - Chapter 28 ListBox的基本运用与更改预设样式

ListBox 不显示对 DataSource 的更改

获取ListBox中的ListBoxItem

如何在 C# 中使用 ListBox 更改焦点 [重复]

通过列表框项目选择c#更改复选框的状态

ListBox 按条件更改元素的文本颜色