Как получить связанный объект в обработчике события нажатия кнопки повторителя? - PullRequest
1 голос
/ 20 декабря 2011

У меня есть повторитель и я привязываю к нему список объектов, например:

List<MyClass> myList = //....
MyRepeater.DataSource = myList;
MyRepeater.DataBind();

Внутри ретранслятора у меня есть кнопка ссылки, которая обрабатывается этим обработчиком:

protected void Button_ItemCommand(object source, RepeaterCommandEventArgs e) {
    if (e.CommandName == "Edit") {
        // I need to get my listItem.Id here
    }
}

Это должно быть легко, но я не могу найти, как это сделать.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Если вы хотите, чтобы кнопка ссылки была нажата, она уже передается этому методу в параметре object source - просто приведите его соответствующим образом.

LinkButton lb = source as LinkButton;

Если вам нужен другой элемент управления, который находится вваш репитер, вы можете использовать

Button randomButton = e.Item.FindControl("buttonId") as Button;

EDIT

Если вы хотите, чтобы свойство объекта связывалось с этой строкой, это будет непросто,и это будет ужасноВам нужно будет сохранить DataSource, с которым связан повторитель, через обратные передачи, либо в Session, либо во ViewState.После того, как вы это сделаете, вы можете получить доступ к соответствующему объекту в источнике, сопоставив его индекс с индексом строки перевитчика, по которой вы щелкнули, что вы можете получить:

e.Item.ItemIndex

Обратите внимание, чтоСамый простой способ - просто сохранить это значение где-нибудь в вашем репитере.

3 голосов
/ 17 апреля 2012

В большинстве случаев легко получить связанный объект из вашего хранилища / кэша / и т. Д.если у вас есть идентификатор.Поскольку вы сказали в своем вопросе «I need to get my listItem.Id here», я думаю, вы не возражаете против повторного извлечения самого объекта и просто ищете способ получить только идентификатор из повторителя.

Просто дайтенажмите аргумент команды, как показано:

<asp:LinkButton runat="server" ID="lnkEdit" CommandName="Edit"
  CommandArgument='<%# Eval("ID") %>'>Edit</asp:LinkButton>

Тогда, как вы правильно сказали в своем вопросе,

protected void Button_ItemCommand(object source, RepeaterCommandEventArgs e) {
  if (e.CommandName == "Edit") {
    // I need to get my listItem.Id here
    RenderEditDialog(FetchFromStorage(e.CommandArgument.ToString());
  }
}
2 голосов
/ 20 декабря 2011

Вы не можете сделать это.Исходный объект с привязкой к данным не сохраняется ASP.Net через обратные передачи.Вы должны хранить данные, которые хотите сохранить, в контроллере внутри ретранслятора.Затем вы можете получить доступ к элементу управления через EventArgs, например,

e.Item.FindControl("myControl");
...