Я бы лично использовал Repeater в этом случае и привязал бы его к вашему LinqDataSource.
Затем вы можете обработать событие OnItemDataBound и получить объект e.Item.DataItem
для каждой строки. Получите ссылку на ваши кнопки «Вверх» и «Вниз», используя e.Item.FindControl("btnUP") as Button
, и установите для аргумента команды кнопки порядковый номер вашего DataItem.
Затем в событии OnClick кнопки используйте CommandArgument, чтобы изменить порядок и обновить свой LinqDataSource, а затем повторно связать повторитель, чтобы отобразить изменения.
Правка - добавление дополнительной ясности
Допустим, у вас есть List<Employee>
в качестве источника данных, а объект Employee определен как
public class Employee
{
int EmployeeID;
int PlaceInLine; // value indicating the sequence position
string Name;
}
Ваши кнопки «Вверх» и «Вниз» могут быть определены в вашем ListView следующим образом:
<asp:Button ID="btnUpButton" runat="server"
CommandArgument='<%#Eval("EmployeeID") %>' OnClick="btnUp_Click" />
Когда кнопка нажата, вы можете обработать событие - это предполагает, что у вас есть список сотрудников, доступный как частная переменная:
private List<Employee> _Employees;
protected void btnUp_Click(object sender, EventArgs e)
{
Button btnUp = sender as Button;
int employeeID = int.Parse(btnUp.CommandArgument); // get the bound PK
Employee toMoveUp = _Employees.Where(e=>e.EmployeeID == employeeID).FirstOrDefault();
// assuming PlaceInLine is unique among all employees...
Employee toMoveDown = _Employees.Where(e=>e.PlaceInLine == toMoveUp.PlaceInLine + 1).FirstOrDefault();
// at this point you need to ++ the employees sequence and
// -- the employee ahead of him (e.g. move 5 to 6 and 6 to 5)
toMoveUp.PlaceInLine ++;
toMoveDown.PlaceInLine --;
// save the list
DataAccessLayer.Save(_Employees);
//rebind the listivew
myListView.DataBind();
}