我有一个对象,其中包含所选列表中的一些属性 - 让我们说一个可以有0到X个通信渠道的促销。要显示/编辑此信息,我使用的选项是SelectionMode == MultiExtended。
但在某些情况下,它表现得很奇怪
我选择了2个宣传渠道(三个频道中的第一个和最后一个),
我点击第二个频道(之前是唯一未选择的频道)并知道它显示,第一和第二频道被选中(我在列表框SelectedIndexChanged事件的开头进行了检查 - 它显示那个SelectedItems.Count == 2,虽然我点击了一个没有按住Ctrl或Shift键的项目,在这种情况下,SelectedIndexChanged事件被触发两次在所有其他情况下它只被触发一次
只有在我第一次打开此对话框后,如果我手动选择第1项和第3项频道,然后点击第2项 - 然后它才能正常工作
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]);
}
}
}
}
单击一个先前未选择的列表会同时选择 - 新选择的项目和列表的第一项?
答案 0 :(得分:1)
您的PromotionCommunicationList
和HistoryCommunicationList
与DataSource
的对象列表共享相同的引用。也就是说,它们具有相同的BindingContext
并且共享相同的CurrencyManager
。 CurrencyManager
正在记住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集合产生影响?