在组合上设置DataSource时遇到一些问题。
我有一个帮助方法,我在组合和默认项目中传递。
在此方法中,设置了组合的DataSource,用于触发SelectionChanged事件。 然后,Selectionchanged事件再次调用此辅助方法,以便可以根据第一个组合中选定的ID设置另一个组合的DataSource。然后重复此过程再进行6次组合,每次调用数据库以获取新数据。
在此方法中设置了DataSource之后,我将使用传入的defaultItem设置组合的SelectedValue。这会导致链再次启动,当然还有所有数据库调用。
绕过这个最好的方法是什么?
我已尝试使用SelectionChangeCommitted事件,但这不会启动链。
提前致谢。
我正在使用C#.Net 4.0
答案 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看到的示例只有在您完成加载数据后才挂钩选择更改事件。因此,不要使用设计器来连接事件,而是自己处理它。