Привязка объекта к элементу управления - PullRequest
2 голосов
/ 07 июня 2011

Вы должны простить меня, если это не имеет смысла, поскольку я все еще очень новичок в ASP.NET.

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

Что мне интересно знать, так это то, как я могу «комбинировать» разделы и знать, откуда берутся данные на стороне сервера (это, вероятно, не имеет смысла; я попробую еще раз). Из приведенного ниже кода, когда пользователь нажимает кнопку LinkButton рядом с именем персоны, запускается HelloHandler. Но как я могу узнать , чье имя было тем, с которым ссылка логически связана на странице? Как я могу "получить" их имя?

ASPX

<asp:Repeater ID="Queue" runat="server">
 <ItemTemplate>
  <div>
   <%# Eval("Name") %><br />
   <asp:LinkButton runat="server" Text="Say Hello" OnClick="HelloHandler"></asp:LinkButton>
  </div>
 </ItemTemplate>
</asp:Repeater>

CS

public List<Person> People = new List<Person>();

protected void Page_Load(object sender, EventArgs e){

 People.Add(new Person("Albert"));
 People.Add(new Person("Bradley"));
 People.Add(new Person("Chad"));
 //etc...

 Queue.DataSource = People;
 Queue.DataBind();

}

public void HelloHandler(object sender, EventArgs e){
 //?
}

Редактировать

Для пояснения я хочу иметь возможность вернуться к соответствующему объекту Person в Списке из обработчика событий.

Ответы [ 3 ]

2 голосов
/ 07 июня 2011

В такой ситуации вы должны использовать свойство LinkButton.CommandArgument .Вы можете установить данные для каждого LinkButton с некоторыми данными и затем извлекать эти данные, когда вызывается обработчик события кнопки.

1 голос
/ 07 июня 2011

Я думаю, что я знаю, что вы после, код ниже позволит вам удалить элемент из повторителя от нажатия кнопки ссылки.

РЕДАКТИРОВАТЬ: В ответ на комментарий я изменил код, чтобы показать, как передать идентификатор обратно в командное событие.

Измените верхнюю строку на

<asp:Repeater ID="Queue" runat="server" ItemCommand="rpt_ItemCommand">

и следующую строку для вашей кнопки ссылки

<asp:LinkButton id="lbDelete" runat="server" Text="[Delete]" CommandName="delete"></asp:LinkButton>

Затем добавьте следующее в ваш cs

Чтобы получить идентификатор элемента повторителя, вы должны использовать CommandArgument, который задается во время привязки данных.

protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
      if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
      {
           var lbDelete = (LinkButton)e.Item.FindControl("lbDelete");
           lbDelete.CommandArgument = retailItem.Id.ToString();
    }
}

protected void rpt_ItemCommand(object source, RepeaterCommandEventArgs e) 
{
   if (e.CommandName == "delete")
        {
            LinkButton btn = e.CommandSource as LinkButton;

            if (btn != null)
            {
                var itemID = (string)e.CommandArgument;

                //Do Stuff
            }
        }
}

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

0 голосов
/ 07 июня 2011

Исходя из того, что опубликовал TheAlbear, я нашел это в обработчике событий.

public void rpt_ItemCommand(object source, RepeaterCommandEventArgs e) {
    Person p = People[e.Item.ItemIndex];
}

Я не знаю, насколько надежно использование индекса.

...