1

我正在收集用户从列表框中选择的所有项目,并在我的应用程序的文本框中输入值。但是,我从 myListBox.SelectedItems 收到的项目始终是排序的,而我需要保留用户选择这些项目的顺序。

我正在使用 Winforms。我知道 WPF 中的列表框返回我想要的,但我没有使用 WPF,只是简单的 winform 和 C#。

4

3 回答 3

4

这不是正确的 UI。如果订单对您很重要,那么它对用户也很重要。除了记忆之外,谁没有办法知道他选择项目的顺序。像电话这样的简单中断足以迷路。

相反,使用两个列表框。左边是选项,右边是选定的项目。提供按钮让用户将它们从一个移动到另一个,并在右侧向上/向下移动项目。现在顺序很明显并且可以修改。你的问题也解决了。

我通过 Google 图像搜索找到的随机图像(忽略样式选择):

在此处输入图像描述

于 2013-10-15T22:13:38.513 回答
2

您可以将事件处理程序添加到 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 包含已选择的索引列表。单击几个不同的项目后在调试中看起来像这样:

SelectionOrder 数组的调试显示

只是不要忘记将“CatchListSelection”添加到列表框的 SelectedIndexChanged 事件中。

于 2013-10-15T22:08:01.720 回答
1

您可以尝试使用此代码准确轻松地记录订单:

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]);
于 2013-10-16T04:20:59.877 回答