2012-06-07 30 views
3

我想在C#中使用多扩展ListBox用户控件执行以下操作。多扩展列表框选择问题

假设我有一个项目

item 1 
item 2 
item 3 
item 4 
item 5 

,我选择第1项和第2项

如果我按按Ctrl +向下键,列表框更改

的列表框中
item 3 
item 1 
item 2 
item 4 
item 5 

现在,我得到了完美的算法,但我无法保留选定项目的列表。 按下Ctrl + Down/Up键后,所有选中的项目都会被移动,但最后只会选中一个项目 。

我想在按下按键后保留所选项目的列表。

我认为这是因为默认功能为Down/Up关键为MultiExtended ListBox

有什么办法解决这个问题,而不是使用multisimple列表框和添加更多的功能?

+1

假设它是比较短的,或者你可以修剪下来,发布您的代码,增加了这一新功能的移动项目了并按Ctrl +向上/向下时列表下来? –

+0

您可能希望查看ListBox.SelectedItems项目属性。也许订阅该ListBox的KeyDown和/或KeyUp事件,并在移动后存储/恢复所选项目。尽管如此,我还没有测试过它是否有效。 –

回答

0

我用自己的自主开发的代码重新创建了您的问题,并且遇到了您遇到的同一问题。

我发现我的问题是在KeyDown事件期间试图改变数据顺序。

我设法通过在完成KeyDown事件后处理订单更改来实现它。

但是我仍然需要恢复列表框的选择。

这里是我的代码:

public partial class mainForm : Form { 

    delegate void noParamsDelegate(); 
    Stack<noParamsDelegate> methodsToCallWhenIdle = new Stack<noParamsDelegate>(); 

    void application_Idle(object sender, EventArgs e) { 
     if(methodsToCallWhenIdle.Count > 0) { 
      methodsToCallWhenIdle.Pop()(); // Call the deligate at the top of the stack 
     } 
    } 

    public mainForm() { 
     InitializeComponent(); 

     Application.Idle += new EventHandler(application_Idle); 
     bindExampleDataToListBox(); 
     listBox.KeyDown += new KeyEventHandler(listBox_KeyDown); 
    } 

    ListItems boundList = new ListItems(); 

    void listBox_KeyDown(object sender, KeyEventArgs e) { 
     if(e.Control && methodsToCallWhenIdle.Count == 0) { 
      if(e.KeyCode == Keys.Down) { 
      copyOfSelectedItems = createCopyOfSelectedItems(); 
       methodsToCallWhenIdle.Push(moveSelectedDown); 
      } 
      if(e.KeyCode == Keys.Up) { 
       copyOfSelectedItems = this.createCopyOfSelectedItems(); 
       methodsToCallWhenIdle.Push(moveSelectedUp); 
      } 
     } 
    } 

    List<ListItem> copyOfSelectedItems = new List<ListItem>(); 
    void moveSelectedDown() { 
     if(copyOfSelectedItems.Count > 0) { 
      boundList.MoveDown(copyOfSelectedItems); 
      restoreSelection(copyOfSelectedItems); 
     } 
    } 
    void moveSelectedUp() { 
     if(copyOfSelectedItems.Count > 0) { 
      boundList.MoveUp(copyOfSelectedItems); 
      restoreSelection(copyOfSelectedItems); 
     } 
    } 

    void restoreSelection(List<ListItem> selectedItems) { 
     foreach(ListItem item in selectedItems) { 
      listBox.SetSelected(listBox.Items.IndexOf(item), true); 
     } 
    } 

    List<ListItem> createCopyOfSelectedItems() { 
     List<ListItem> result = new List<ListItem>(); 
     foreach(ListItem listItem in listBox.SelectedItems) { 
      result.Add(listItem); 
     } 
     return result; 
    } 

    void bindExampleDataToListBox() { 
     BindingSource bSrc = new BindingSource(); 
     boundList = getExampleData(); 
     bSrc.DataSource = boundList; 
     bSrc.Sort = "OrderValue DESC"; 

     listBox.DataSource = bSrc; 
     listBox.DisplayMember = "TextValue"; 

    } 

    ListItems getExampleData() { 
     ListItems result = new ListItems(); 
     result.Add(new ListItem() { TextValue = "Item 1", OrderValue = 0 }); 
     result.Add(new ListItem() { TextValue = "Item 5", OrderValue = 4 }); 
     result.Add(new ListItem() { TextValue = "Item 3", OrderValue = 2 }); 
     result.Add(new ListItem() { TextValue = "Item 4", OrderValue = 3 }); 
     result.Add(new ListItem() { TextValue = "Item 2", OrderValue = 1 }); 
     return result; 

    } 
} 

我不包括我在执行时listItems和列表项,因为它们没有真正的问题做。但是如果你想要一份他们的副本,那就让我知道。

0

你没有张贴任何代码,但调用e.SuppressKeyPress = true;应该使其工作:

void listBox1_KeyDown(object sender, KeyEventArgs e) { 
    if (e.Control && e.KeyCode == Keys.Down) { 
    e.SuppressKeyPress = true; 

    if (listBox1.SelectedIndices.Count > 0 && 
     listBox1.SelectedIndices[listBox1.SelectedIndices.Count - 1] < listBox1.Items.Count-1) { 

     List<int> selected = new List<int>(); 
     for (int i = 0; i < listBox1.SelectedIndices.Count; i++) { 
     selected.Add(listBox1.SelectedIndices[i]); 
     } 
     listBox1.SelectedIndices.Clear(); 

     for (int i = selected.Count - 1; i >= 0; i--) { 
     object listboxItem = listBox1.Items[selected[i] + 1]; 
     listBox1.Items[selected[i] + 1] = listBox1.Items[selected[i]]; 
     listBox1.Items[selected[i]] = listboxItem; 
     listBox1.SelectedIndices.Add(selected[i] + 1); 
     } 
    } 
    } 
}