3

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、選択したすべての項目が移動しますが、最終的に選択される項目は 1 つだけです。

キーを押した後、選択したアイテムのリストを保持したい。

これはDown/Up、 MultiExtended のキーのデフォルト機能によるものだと思いますListBox

multisimple リスト ボックスを使用して機能を追加する以外に、これを修正する方法はありますか?

4

2 に答える 2

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とListItemの実装は、実際には問題とは関係がないため、含めませんでした。ただし、それらのコピーが必要な場合は、お知らせください。

于 2012-06-11T15:21:00.447 に答える
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);
      }
    }
  }
}
于 2012-06-11T16:01:32.853 に答える