1

在组合上设置 DataSource 时我有一个小问题。

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

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

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

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

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

提前致谢。

我正在使用 C#.Net 4.0

4

4 回答 4

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% 确定这是否适用于您的特定情况,但很容易检查。

于 2012-05-31T11:21:51.273 回答
0

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

于 2012-05-30T13:17:09.950 回答
0

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

于 2012-08-10T19:36:29.893 回答
0

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

编辑:

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

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

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

于 2012-05-30T13:46:01.157 回答