【问题标题】:Don't fire the SelectedIndexChanged event when setting the DataSource on a combo在组合上设置 DataSource 时不要触发 SelectedIndexChanged 事件
【发布时间】:2012-05-30 13:08:03
【问题描述】:

在组合上设置 DataSource 时我遇到了一点问题。

我有一个辅助方法,我传入一个组合和一个默认项。

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

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

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

我尝试使用 SelectionChangeCommitted 事件,但这并没有启动链。

提前致谢。

我正在使用 C#.Net 4.0

【问题讨论】:

    标签: c# combobox datasource selectionchanged


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在使用传入的 defaultItem 设置组合的 SelectedValue 之前尝试取消事件处理程序,然后再将其挂钩。不好看,但是……

        编辑:

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

        我重新阅读了您的问题,并注意到我最初忽略了一些东西,“使用 SelectionChangeCommited 不会启动链”。嗯,没错,SelecttionChangeCommited 仅在用户更改组合选择时触发。

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

        【讨论】:

        • 不能真正做到这一点,因为一切都在辅助方法中。可以通过事件,但我真的不想这样做,除非我别无选择。感谢您的回复。
        • @user1131657 我已经编辑了我的答案,希望这次它可能有用。欢呼
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2019-01-28
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 2018-09-15
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多