在组合上设置DataSource时,不要触发SelectedIndexChanged事件

时间:2012-05-30 13:08:04

标签: c# combobox datasource selectionchanged

在组合上设置DataSource时遇到一些问题。

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

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

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

绕过这个最好的方法是什么?

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

提前致谢。

我正在使用C#.Net 4.0

4 个答案:

答案 0 :(得分:1)

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

    private void comboBoxSomeList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        // Ignore changes that are made during initialization
        if (e.AddedItems.Count != e.RemovedItems.Count)
            return;
        ...

请注意,我并非100%确定这会在您的特定情况下有效,但检查非常简单。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

编辑:

我从下面的评论中得知,因为你对六个组合使用相同的辅助方法,你不能挂钩/取消挂钩事件,因为你无法分辨你每次处理哪个组合。没错,起初我没注意到。

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

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

答案 3 :(得分:0)

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