多值ListBox自动选择不需要的项目

时间:2014-06-22 15:58:53

标签: c# winforms listbox

我有一个对象,其中包含所选列表中的一些属性 - 让我们说一个可以有0到X个通信渠道的促销。要显示/编辑此信息,我使用的选项是SelectionMode == MultiExtended。

但在某些情况下,它表现得很奇怪

  1. 我选择了2个宣传渠道(三个频道中的第一个和最后一个),

  2. 我点击第二个频道(之前是唯一未选择的频道)并知道它显示,第一和第二频道被选中(我在列表框SelectedIndexChanged事件的开头进行了检查 - 它显示那个SelectedItems.Count == 2,虽然我点击了一个没有按住Ctrl或Shift键的项目,在这种情况下,SelectedIndexChanged事件被触发两次在所有其他情况下它只被触发一次

  3. 只有在我第一次打开此对话框后,如果我手动选择第1项和第3项频道,然后点击第2项 - 然后它才能正常工作

  4. 操作中的问题的截屏视频

    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";
    

    这是我根据促销数据

    加载选定项目的方式
    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]);
                }
            }
        }
    }
    

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

    单击一个先前未选择的列表会同时选择 - 新选择的项目和列表的第一项?

2 个答案:

答案 0 :(得分:1)

您的PromotionCommunicationListHistoryCommunicationListDataSource的对象列表共享相同的引用。也就是说,它们具有相同的BindingContext并且共享相同的CurrencyManagerCurrencyManager正在记住ListBox控件中的所选项目,而这是您创建冲突的位置,因为他正在保存您ListBoxes的所选项目。您已经找到了问题的解决方案,因为当您将“different”列表(原始版本的副本)设置为CurrencyManager时,会创建新的DataSource。另一种可能的解决方案是为您的BindingContext控件之一创建新的ListBox 你可以尝试一下:

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

它应该可以解决你的问题。有关BindingContext检查MSDN上的this链接的详细信息。

答案 1 :(得分:0)

我找到问题的原因,虽然我真的不明白为什么会导致这种行为如果有人会回答这个问题,我会接受它作为答案这个问题

我的表单中有两个listbox-es,两个使用相同的集合作为数据源,但是!!! SelectedItems是使用代码选择的(实际上似乎在winforms中它是不可能数据列表列表框的选择项)

初步我的代码是:

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

更正版本为:

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

我知道ToList()会复制,但我不明白为2个listbox-es的列表项设置与DataSource相同的集合有什么问题?为什么这会对SelectedItems集合产生影响?