在组合上设置数据源时,不要触发 SelectedIndexChanged 事件

本文关键字:SelectedIndexChanged 事件 组合 设置 数据源 | 更新日期: 2023-09-27 18:35:40

我在组合上设置数据源时遇到了一个小问题。

我有一个帮助程序方法,我在组合和默认项中传递它。

在此方法中,设置组合的数据源,用于触发 SelectionChanged 事件。然后,Selectionchanged 事件再次调用此帮助程序方法,以便可以根据第一个组合中的选定 ID 设置另一个组合的数据源。然后对另外 6 个组合重复此过程,每次调用数据库以获取新数据时。

在此方法中设置数据源后,我使用传入的 defaultItem 设置组合的 SelectedValue。然后,这会导致链再次启动,当然还有所有数据库调用。

解决这个问题的最佳方法是什么?

我尝试使用SelectionChangeCommit 事件,但这不会启动链。

提前谢谢。

我正在使用 C#.Net 4.0

在组合上设置数据源时,不要触发 SelectedIndexChanged 事件

我使用以下代码通过加载数据(数据源=...)与实际选择更改来区分组合框选择更改事件的原因。

    private void comboBoxSomeList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // Ignore changes that are made during initialization
        if (e.AddedItems.Count != e.RemovedItems.Count)
            return;
        ...

请注意,我不是 100% 确定这是否适用于您的特定情况,但很容易检查。

它不是最漂亮的,但我通常通过在类中设置某种手动选择更改进度成员字段来处理这个问题,所以我会在设置 SelectedValue 之前将其设置为 true,在设置 SelectedValue 之后将其设置为 false,然后在启动您试图避免的整个数据源过程之前检查字段值。

尝试在将组合的 SelectedValue 与传入的 defaultItem 一起设置之前取消挂钩事件处理程序,然后再次挂钩。它不漂亮,但是...

编辑:

我从您下面的评论中得到,因为您对六个组合使用相同的辅助方法,因此您无法钩住/取消挂钩事件,因为您无法分辨每次都在处理哪个组合。没错,一开始我没有注意到这一点。

重读了你的问题,并注意到我一开始忽略了一些东西,"使用SelectionChangeCommited不会启动链条"。嗯,没错,SelecttionChangeCommit 仅在用户更改组合选择时触发。

回顾一下,您需要从帮助程序方法中开始更改,当组合数据源发生更改时(但不是在设置默认值时),以及当用户更改组合的选定值之一时(链将从该组合开始)。我认为您可以保留您的帮助程序方法并使用 OnDataSourceChanged (用于在数据源更改时从辅助程序方法触发链)和 OnSelectionChangeComitted(用于在用户选择时触发链)的组合。您甚至不需要为每个组合编写两个手,因为这两个事件具有相同的签名,因此您可以将它们挂接到相同的方法。也就是说,现在挂接到每个组合的 SelectionChanged 的方法可以挂接到 SelectionChangeCommit 和 DataSourceChanged。希望这有帮助。

我从中看到的示例Microsoft仅在加载完数据后通过挂钩选择更改事件来处理这个问题。 因此,与其使用设计器来挂接事件,不如自己处理它。

相关文章:
  • 没有找到相关文章