我正在尝试使用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 +向下/向上键后,所有选定的项目都会移动,但只有一项 最终被选中。
我希望在按键后保留所选项目的列表。
我认为这是因为MultiExtended ListBox
的 Down / Up 键的默认功能。
除了使用多个简单列表框并添加更多功能之外,还有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
我用我自己的自己开发的代码重新创建了你的问题,我遇到了同样的问题。
我发现问题在于我在KeyDown事件期间尝试更改数据顺序。
我设法通过在KeyDown事件完成后处理订单更改来使其工作。
我仍然需要恢复ListBox的选择。
这是我的代码:
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的实现,因为它们与问题没有关系。但如果您想要一份副本,请告诉我。
答案 1 :(得分: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);
}
}
}
}