Привязка объекта к элементу управления



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



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



Что меня интересует, так это то, как я могу "комбинировать" разделы и знать, откуда берутся данные на стороне сервера (это, вероятно, не имеет смысла; я попробую снова).
Из кода ниже, когда пользователь нажимает кнопку 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){
//?
}


Edit



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

674   3  

3 ответов:

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

EDIT: в ответ на комментарий я изменил код, чтобы показать, как передать идентификатор обратно в событие команды.

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

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

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

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

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

Чтобы получить идентификатор элемента repeater, вы 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
            }
        }
}

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

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

Основываясь на том, что написал TheAlbear, я придумал это в обработчике событий.

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

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

Comments

    Ничего не найдено.