2011-10-07 45 views
0

我有一個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; 

     } 
    } 

可能是我需要做的通過指針和引用這種變化。但是,我如何才能在活動形式中反映這種變化?

+0

你需要提供更多的細節,比如什麼是myController的:如果是myController的用戶控件從派生,或以其他內將孩子們置於自己的繪圖區域這將是很容易嗎? –

回答

1

您正在更改列表中的順序,但不是UI中兩行的相對位置。集合中控件的順序對於大多數UI對象來說幾乎沒有意義,除非該順序專門用於定義位置(例如集合是ListBox或類似控件的DataSource)。

除了控件本身之外,您需要做的是交換MyController的每個實例或其包含的控件的Y座標。

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); 
    } 
} 
+0

感謝朋友的工作。 –

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); 
} 
+0

這會更改集合中行的順序,但不會改變它們在UI上的位置。它只會在_myController是ListView的數據源或其他東西時才起作用。 – KeithS