C# 多扩展列表框选择问题

C# 多扩展列表框选择问题,c#,winforms,listbox,C#,Winforms,Listbox,我正在尝试使用C#中的多扩展ListBox用户控件执行以下操作 假设我有一个项目列表框 item 1 item 2 item 3 item 4 item 5 我选择项目1和项目2 如果按Ctrl+Down键,列表框将变为 item 3 item 1 item 2 item 4 item 5 现在,我的算法运行得很好,但我无法保留所选项目的列表。 按下Ctrl+Down/Up键后,所有选定的项目都将移动,但仅移动一个项目 最后被选中 我想在按键后保留所选项目的列表 我认为这是

我正在尝试使用C#中的多扩展ListBox用户控件执行以下操作

假设我有一个项目列表框

item 1 
item 2 
item 3 
item 4 
item 5 
我选择项目1和项目2

如果按Ctrl+Down键,列表框将变为

item 3 
item 1
item 2 
item 4 
item 5 
现在,我的算法运行得很好,但我无法保留所选项目的列表。 按下Ctrl+Down/Up键后,所有选定的项目都将移动,但仅移动一个项目 最后被选中

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

我认为这是因为MultiExtended
列表框的默认向下/向上键功能


除了使用multisimple列表框和添加更多功能之外,还有其他方法可以解决此问题吗

我用自己编写的代码重新创建了您的问题,遇到了与您相同的问题

我发现对我来说,问题在于在键控事件期间试图改变数据顺序

我通过在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;

    }
}
public分部类mainForm:Form{
委托void noParamsDelegate();
Stack methodsToCallWhenIdle=新堆栈();
无效应用程序\u空闲(对象发送器、事件参数){
如果(methodsToCallWhenIdle.Count>0){
methodsToCallWhenIdle.Pop();//调用堆栈顶部的deligate
}
}
公共表格({
初始化组件();
Application.Idle+=新的事件处理程序(Application\u Idle);
bindExampleDataToListBox();
listBox.KeyDown+=新的KeyEventHandler(listBox\u KeyDown);
}
ListItems boundList=新建ListItems();
void listBox_KeyDown(对象发送方,KeyEventArgs e){
if(e.Control&&methodsToCallWhenIdle.Count==0){
if(e.KeyCode==Keys.Down){
copyOfSelectedItems=createCopyOfSelectedItems();
方法调用whenidle.Push(moveSelectedDown);
}
if(e.KeyCode==Keys.Up){
copyOfSelectedItems=this.createCopyOfSelectedItems();
方法调用whenidle.Push(moveSelectedUp);
}
}
}
List copyOfSelectedItems=新列表();
void moveSelectedDown(){
如果(copyOfSelectedItems.Count>0){
boundList.MoveDown(选择项的副本);
恢复选择(选择的副本);
}
}
void moveSelectedUp(){
如果(copyOfSelectedItems.Count>0){
boundList.MoveUp(选择项的副本);
恢复选择(选择的副本);
}
}
无效恢复选择(列表selectedItems){
foreach(selectedItems中的ListItem项){
listBox.SetSelected(listBox.Items.IndexOf(item),true);
}
}
列表createCopyOfSelectedItems(){
列表结果=新列表();
foreach(listBox.SelectedItems中的ListItem ListItem){
结果.添加(列表项);
}
返回结果;
}
void bindExampleDataToListBox(){
BindingSource bSrc=新的BindingSource();
boundList=getExampleData();
bSrc.DataSource=边界列表;
bSrc.Sort=“OrderValue DESC”;
listBox.DataSource=bSrc;
listBox.DisplayMember=“TextValue”;
}
ListItems getExampleData(){
ListItems结果=新建ListItems();
添加(新的ListItem(){TextValue=“Item 1”,OrderValue=0});
添加(新的ListItem(){TextValue=“Item 5”,OrderValue=4});
添加(新的ListItem(){TextValue=“Item 3”,OrderValue=2});
添加(新的ListItem(){TextValue=“Item4”,OrderValue=3});
添加(新的ListItem(){TextValue=“Item 2”,OrderValue=1});
返回结果;
}
}

我没有包括ListItems和ListItem的实现,因为它们实际上与问题无关。但是如果您想要一份副本,请告诉我。

您没有发布任何代码,但是调用了
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);
      }
    }
  }
}
void listBox1\u KeyDown(对象发送方,KeyEventArgs e){
if(e.Control&&e.KeyCode==Keys.Down){
e、 SuppressKeyPress=true;
如果(listBox1.SelectedIndices.Count>0&&
listBox1.SelectedDices[listBox1.SelectedDices.Count-1]=0;i--){
对象listboxItem=listBox1.Items[所选[i]+1];
listBox1.Items[selected[i]+1]=listBox1.Items[selected[i]];
listBox1.Items[所选[i]]=listboxItem;
listBox1.SelectedDices.Add(selected[i]+1);
}
}
}
}