上下移动的名单

时间:2014-09-12 10:49:14

标签: c# generic-list

我使用观察集合来存储我绑定到WPF Listview的列表,我的问题是我正在尝试使前端命令正常工作。在最小值如果我单击我的向上移动按钮,它将项目向上移动,但它不会更改列表中已填充的项目。这应该很容易,但我发现它很难。

我的问题是如何根据以下序列正确更改订单号位置以反映用户点击鼠标按钮后更新列表中的其他项目以反映新位置,如目前所示更改现有元素或新附加元素的数量。

  Order     Display Name     Width
  1         Title            50
  2         Description      150 

我使用添加按钮

将一个项目添加到列表中
  Order     Display Name     Width
  1         Title            50
  2         Description      150 
  3         Newitem          50

一旦新的列表顺序变为

,我会单击上移按钮
  Order     Display Name     Width
  1         Title            50
  2         Newitem          50 
  3         Description      150

使用的代码如下

    ObservableCollection<CustomColumnsModel> columnsList = this.WizardData.ConcreteCustomColumnsProxy;
    Extensions.MoveItemUp(columnsList, this.listView1.SelectedIndex);

    int offset = 0;
    var selectedColumnItem = listView1.SelectedItem as CustomColumnsModel;

    foreach (CustomColumnsModel item in columnsList)
    {

        foreach (CustomColumnsModel item in this.listView1.SelectedItems)
        {
            item.CustomColumnsOrder -= 1;
        }else if (listView1.SelectedItem > item)
        {
                item.CustomColumnsOrder +1;
        }



    }

以下是我的扩展方法

  public static void MoveItemUp<T>(this ObservableCollection<T> baseCollection, int selectedIndex)
    {
        //# Check if move is possible
        if (selectedIndex <= 0)
            return;

        //# Move-Item
        baseCollection.Move(selectedIndex - 1, selectedIndex);
    }

这是我的poco课程

 public class CustomColumnsModel : INotifyPropertyChanged
 {
    public event PropertyChangedEventHandler PropertyChanged;
    public const string IdPropertyName = "CustomColumnsID";
    private Guid _Id = Guid.Empty;
    public Guid CustomColumnsID
    {
        get { return _Id; }
        set
        {
            if (_Id == value)
                return;
            _Id = value;
            NotifyPropertyChanged(IdPropertyName);
        }
    }


    public string CustomColumnsDisplayName { get; set; }
    public int CustomColumnsWidth { get; set; }
    public int CustomColumnsOrder { get; set; }  


    protected void NotifyPropertyChanged(string key)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(key));
        }
    }

    public EnterpriseManagementObject ActualData { get; private set; }

编辑以显示基于建议尝试的代码

  foreach (CustomColumnsModel item in columnsList)
    {

         if (item.CustomColumnsOrder < item.ColumnIndex)
         item.CustomColumnsOrder -= 1;
         else if (item.CustomColumnsOrder > item.ColumnIndex)
         item.CustomColumnsOrder -= 1;
   }

2 个答案:

答案 0 :(得分:0)

您似乎需要在对象上拥有索引属性,并且每当有人点击up时,如果它不是最重要的属性,那么您就是&#39;我必须将索引号与其上方的索引号进行交换。

当有人点击down时,如果它不是最低点,则再次交换项目。

  

订单id val   1。 。 。 1。一个
  2。 。 。 2。 2个
  3。 。 。 3。三个

将成为(假设你遇到3):

  

订单id val   1。 。 。 1。一个
  3。 。 。 2。 2个
  2。 。 。 3。 3

然后按顺序对它们进行排序。


修改

    // The following will never be smaller than 0
    if (selectedIndex <= 0)
        return;

    // This is not really doing what you want. 
    baseCollection.Move(selectedIndex - 1, selectedIndex);

你想要一个var item_to_move_up等于所选索引中的项目,并且一个item_to_move_down就是它上面的那个(假设你在逻辑中检查了它)不是第一个) 接下来,交换他们的订单值。类似的东西:

var temp_val = item_to_move_up.order;
item_to_move_up = item_to_move_down.order;
item_to_move_down = temp_val;

答案 1 :(得分:0)

我知道这是一篇较旧的文章。 但是,万一有人到这里来...

这是我所做的事的一个例子。

ui - example sorting a collection

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private List<Student> students = new List<Student>()
    {
        new Student(){ name="Jimmy" },
        new Student(){ name="Billy" },
        new Student(){ name="Sarah" },
        new Student(){ name="Bobby" },
        new Student(){ name="Garry" },
        new Student(){ name="Eva" },
        new Student(){ name="Nancy" }
    };
    private Student _student;

    private class Student
    {
        public string name { get; set; }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MoveUpDn(true);
    }
    private void MoveUpDn(bool blnUp)
    {
        if (_student == null) return;
        int idx = students.IndexOf(_student);
        if (blnUp)
        {
            if (idx <= 0) return;
            students.Insert(idx - 1, _student);
            students.RemoveAt(idx + 1);
            idx--;
        }
        else
        {
            if (idx >= students.Count - 1) return;
            students.Insert(idx + 2, _student);
            students.RemoveAt(idx);
            idx++;
        }
        UpdateMyList();
        this.listBox1.SelectedIndex = idx;
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        UpdateMyList();
    }
    private void UpdateMyList()
    {
        this.listBox1.DataSource = null;
        this.listBox1.DataSource = students;
        this.listBox1.DisplayMember = "name";
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedItem == null) return;
        if (listBox1.SelectedItem.GetType() != typeof(Student)) return;
        Student student = this.listBox1.SelectedItem as Student;
        if (student == null) return;
        _student = student;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        MoveUpDn(false);
    }
}
}