更改列表数组中表单对象的位置值

时间:2011-10-07 17:03:12

标签: c# forms list textbox

我有一个winform,其中有一个MyController对象列表。

List<MyController> _myController = new List <MyController>();

此mycontroller对象包含1个复选框4文本框和每行1个按钮。

我想要的是当我单击一行中的按钮时,我希望整行向上移动,而上侧的行将自动向下移动。

如何在C#中编写代码?

在buttonClick函数中,我尝试了以下操作,但显然它不起作用:

private void downButton_Click(object sender, EventArgs e)
    {
        string NameSet = (sender as Button).Name.Split(new char[] { '_' })[1];
        int itemNo = Int32.Parse(NameSet);
        MyControls tempObj = new MyControls();
        if (itemNo>0)
        {
        tempObj = _myControls[itemNo];
        _myControls[itemNo] = _myControls[itemNo - 1];
        _myControls[itemNo - 1] = tempObj;

        }
    }

我可能需要通过指针和引用进行此更改。但是,我如何以我的活动形式反映这种变化呢?

2 个答案:

答案 0 :(得分:1)

您正在更改列表中的顺序,但不会更改UI中两行的相对位置。对于大多数UI对象,集合中控件的顺序几乎毫无意义,除非该顺序专门用于定义位置(例如,如果集合是ListBox或类似控件的DataSource)。

除了控件本身之外,您需要做的是交换MyController的每个实例的Y坐标或其包含的控件。如果MyController是从UserControl派生的,或者有其自己的绘图区域,孩子们在其中定位,那将非常容易:

private void downButton_Click(object sender, EventArgs e)
{
    string NameSet = (sender as Button).Name.Split(new char[] { '_' })[1];
    int itemNo = Int32.Parse(NameSet);
    if (itemNo>0)
    {
       //swap row locations
       var temp = _myControls[itemNo-1].Y;
       _myControls[itemNo-1].Y = _myControls[itemNo].Y;
       _myControls[itemNo].Y = temp;
       //swap list order
       var tempObj = _myControls[itemNo];
       _myControls.RemoveAt(itemNo);
       _myControls.Insert(tempObj, itemNo-1);
    }
}

答案 1 :(得分:0)

public void MoveItemUp( int index ) {
    MyController c = _myController[index];
    _myController.RemoveAt( index );
    _myController.Insert( index - 1, c );
}

public void MoveItemDown( int index ) {
    MyController c = _myController[index];
    _myController.RemoveAt( index );
    _myController.Insert( index + 1, c );
}