排序数据绑定对象内的列表时出现问题

时间:2010-08-24 20:08:16

标签: c# data-binding list

我有一个List<ColumnList> ColumnListLists,它附加了一个绑定源(bsLists)。 ColumnList内部有一个List<Column>。我有一个绑定源附加到指向该内部列表的bsLists的当前。

困惑了吗?这里有一些可能有用的代码。

public class ColumnList
{
     ...
     public string Name { get; set;}
     public List<Column> ListOfColumns { get; set;}
}

public class Column
{
    ...
    public string HeaderName { get; set; }
}

public class CustContractsSetup
{
    public CustContractsSetup()
    {
        InitializeComponent();
        bsLists = new BindingSource(Properties.Settings.Default.ColumnListLists, null);
        cmbListName.DataSource = bsLists;
        cmbListName.DisplayMember = "Name";
        bsColumns = new BindingSource(bsLists, "ListOfColumns");
        lbCurrent.DataSource = bsColumns;
        lbCurrent.DisplayMember = "HeaderName";
    }
    BindingSource bsLists;
    BindingSource bsColumns;
    ListBox lbCurrent;
}

现在我要做的是改变两个Column的顺序。

private void btnUp_Click(object sender, EventArgs e)
{
    if (lbCurrent.SelectedIndex <= 0 || lbCurrent.SelectedIndex > bsColumns.Count)
        return;
    System.Diagnostics.Debug.Print("before:");
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex - 2].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex - 1].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex + 1].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex + 2].HeaderName);
    ((ColumnList)bsLists.Current).ListOfColumns.Reverse(lbCurrent.SelectedIndex - 1, 1);
    Debug.Print("after:");
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex - 2].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex - 1].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex + 1].HeaderName);
    Debug.Print(((ColumnList)bsLists.Current).ListOfColumns[lbCurrent.SelectedIndex + 2].HeaderName);
    bsLists.ResetCurrentItem();
}

这是我得到的输出

before:
Conversion Level
Conversion Programmer
Edge Required
Education Required
Target Month
after:
Conversion Level
Conversion Programmer
Edge Required
Education Required
Target Month

如果事情有效,那么Edge Required应该与Conversion Programmer交换。但是你可以看到前后列表完全一样。

我犯了什么样的错误让我的清单无法更改订单?

1 个答案:

答案 0 :(得分:1)

我认为您的基本问题是反转范围的大小,请尝试:

 .Reverse(lbCurrent.SelectedIndex - 1, 2);