多值列表框自动选择不希望的产品(Multi value ListBox automatically

2019-10-20 08:05发布

我有一个具有选自列表中的一些属性的对象 - 比方说,一个促进,可以有0到X的沟通渠道。 要显示/编辑这个信息我使用与选择的SelectionMode == MultiExtended一个列表框。

但在某些情况下,行为怪异

  1. 我有促进与选定的2个的通信​​信道(第一和先进后出三个通道),

  2. 我点击的第二通道(以前是唯一未选择的通道),并知道它表明,是第1和第2声道选择(我把支票在列表框的SelectedIndexChanged事件的开始 - 它表明SelectedItems.Count == 2,虽然我点击了一个单一的项目在所有其他情况下,未持有Ctrl或Shift键),在这种情况下,SelectedIndexChanged事件被触发两次被触发只有一次

  3. 这种情况只有我第一次打开这个dialogform后,如果我手动选择通道的第1和第3项,然后单击第二个项目 - 那么它工作正常

在行动的问题截屏

http://screencast.com/t/lVs0e9oau

这是我如何加载所有可能的渠道进入列表框的列表

foreach (var ct in Promotion_operations.Configuration.PromoCommunicationTypes)
{
    KeyValuePair<string, PromotionCommunicationType> nct = 
        new KeyValuePair<string, PromotionCommunicationType>(ct.Name, ct);
    communications.Add(nct);
}
PromotionCommunicationList.DataSource = communications; //Promotion_operations.Configuration.PromoCommunicationTypes;
PromotionCommunicationList.DisplayMember = "Key";
PromotionCommunicationList.ValueMember = "Value";

这是一种基于推广的数据我怎么加载selecteditems

private void LoadSelectedCommunicationsList(ListBox lstbox, List<PromotionCommunication> communications)
{
    lstbox.SelectedItems.Clear();
    foreach (var ct in communications)
    {
        for (int j = 0; j < lstbox.Items.Count; j++)
        {                    
            if (ct.CommunicationType.Id == ((KeyValuePair<string, PromotionCommunicationType>)lstbox.Items[j]).Value.Id)
            {
                lstbox.SelectedItems.Add(lstbox.Items[j]);
            }
        }
    }
}

可能是什么这种行为的原因是什么?

在点击一个先前未选择列表中同时选择 - 新选择列表的项目,第一个项目?

Answer 1:

PromotionCommunicationListHistoryCommunicationList都共享同一个参考的对象作为列表DataSource 。 这就是说,它们具有相同BindingContext和共享相同CurrencyManagerCurrencyManager是要记住你的选择的项目ListBox控件而这也正是因为他的储蓄选择两个你的项目中创建您的冲突ListBoxes 。 你已经找到了你的问题的解决方案,因为新CurrencyManager如果将“不同”列表(你原来的一个副本)作为创建DataSource 。 另一种可能的解决方案是新创建BindingContext为您的一个ListBox控件。
你可以试试这个:

PromotionCommunicationList.DataSource = communications;
(..)
HistoryCommunicationList.BindingContext = new BindingContext(); // Add this
HistoryCommunicationList.DataSource = communications;

它应该解决您的问题。 有关的BindingContext更多信息,请这个 MSDN上的链接。



Answer 2:

我发现这个问题的原因,但我真的不明白为什么它造成了这样的行为如果有人回答这个问题,我会接受它作为回答这个问题

我曾在我的表格2列表框-ES和他们两个地方使用相同的集合作为数据源, 但是! SelectedItems使用代码选择(acctually似乎在的WinForms它是不可能的数据绑定列表框的selecteditems)

INITIALLY我的代码是:

PromotionCommunicationList.DataSource = communications;
(..)
HistoryCommunicationList.DataSource = communications;

修改后的版本是:

PromotionCommunicationList.DataSource = communications.ToList();
(..)
HistoryCommunicationList.DataSource = communications.ToList();

我知道,ToList()进行复印,但我不明白这有什么错具有相同集合作为数据源2列表框-ES的列表项? 为什么这对SelectedItems集合的影响?



文章来源: Multi value ListBox automatically selects undesired item