我正在收集用户从列表框中选择的所有项目,并在我的应用程序的文本框中输入值。但是,我从 myListBox.SelectedItems 收到的项目始终是排序的,而我需要保留用户选择这些项目的顺序。
我正在使用 Winforms。我知道 WPF 中的列表框返回我想要的,但我没有使用 WPF,只是简单的 winform 和 C#。
这不是正确的 UI。如果订单对您很重要,那么它对用户也很重要。除了记忆之外,谁没有办法知道他选择项目的顺序。像电话这样的简单中断足以迷路。
相反,使用两个列表框。左边是选项,右边是选定的项目。提供按钮让用户将它们从一个移动到另一个,并在右侧向上/向下移动项目。现在顺序很明显并且可以修改。你的问题也解决了。
我通过 Google 图像搜索找到的随机图像(忽略样式选择):
您可以将事件处理程序添加到 SelectedIndexChanged 以跟踪选择了哪些项目以及选择的顺序。例如:
namespace SandboxTest
{
public partial class ListBox : Form
{
int[] SelectionOrder = new int[50];
int ClickHistory = 0;
public ListBox()
{
InitializeComponent();
}
private void CatchListSelection(object sender, EventArgs e)
{
if (ClickHistory == 42)
{
ClickHistory = 0;
}
SelectionOrder[ClickHistory] = listBox1.SelectedIndex;
ClickHistory++;
}
}
}
然后变量 SelectionOrder 包含已选择的索引列表。单击几个不同的项目后在调试中看起来像这样:
只是不要忘记将“CatchListSelection”添加到列表框的 SelectedIndexChanged 事件中。
您可以尝试使用此代码准确轻松地记录订单:
List<int> selectedIndices = new List<int>();
//SelectedIndexChanged event handler for your listBox1
private void listBox1_SelectedIndexChanged(object sender, EventArgs e){
if (listBox1.SelectedIndex > -1){
selectedIndices.AddRange(listBox1.SelectedIndices.OfType<int>()
.Except(selectedIndices));
selectedIndices.RemoveRange(0, selectedIndices.Count - listBox1.SelectedItems.Count);
}
}
//Now all the SelectedIndices (in order) are saved in selectedIndices;
//Here is the code to get the SelectedItems in order from it easily
var selectedItems = selectedIndices.Select(i => listBox1.Items[i]);