我有一个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 :(得分: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 );
}