Пытаюсь изменить мой список, но не знаю, как получить свойство, которое мне нужно отредактировать. - PullRequest
0 голосов
/ 23 января 2010

Итак, у меня есть ListView, который содержит шаги в процессе. Слева есть метка, просто указывающая, какой это шаг, а справа - текстовое поле с инструкциями. Затем справа от этого TextBox находятся обычные кнопки редактирования и удаления, но у меня также есть стрелка вверх и стрелка вниз. Если щелкнуть, я бы хотел, чтобы текущий набор предметов был перемещен в этот слот.

Этот ListView связан с LinqDataSource, и если бы я мог просто получить доступ к свойству элемента из того набора, где была нажата кнопка, я мог бы просто вызвать ListView.DataBind (), и он бы сам себя отсортировал.

Свойство, о котором я говорю, - это то, что в Лейбле говорит о том, какой это шаг. Я настроил это так:

<asp:Label ID="lblStepNumber" runat="server" Text='<%# Eval( "StepNumber", "Step #{0}" ) %>' />

Так что, если я могу просто сделать что-то вроде

ListView.Items.[Where_btn_clicked].StepNumber++;
ListView.Items.[Where_btn_clicked+1].StepNumber--;
ListView.DataBind();

Это было бы проще всего, но я не знаю, как получить доступ к этому свойству.

1 Ответ

2 голосов
/ 23 января 2010

Я бы лично использовал 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();

}
...