将对象绑定到控件

时间:2011-06-07 17:14:32

标签: c# asp.net postback repeater

如果这没有任何意义,你将不得不原谅我,因为我仍然非常是ASP.NET新手。

我有一个任意长的项目列表(让我们说它是Person类型的列表),我已经弄清楚如何绑定到转发器控件并显示项目的属性(例如,人的名字)。 / p>

我有兴趣知道的是我如何“组合”部分并知道数据来自服务器端的位置(这可能毫无意义;我会再试一次)。 从下面的代码中,当用户在Person名称旁边点击LinkBut​​ton时,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){
 //?
}

修改

为了澄清,我希望能够从事件处理程序返回到List中相应的Person对象。

3 个答案:

答案 0 :(得分:2)

在这种情况下,您将使用LinkButton.CommandArgument属性。您可以使用某些数据为每个LinkBut​​ton设置数据,然后在调用按钮事件处理程序时将数据拉出。

答案 1 :(得分:1)

我想我知道你之后的事情,下面的代码将允许你通过点击链接按钮从转发器中删除一个项目。

编辑:为了回应评论,我更改了代码以显示如何将ID传回命令事件。

将您的第一行更改为

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

以及链接按钮的以下行

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

然后在cs中添加以下内容

要获取转发器项的ID,请使用CommandArgument,在数据绑定期间设置ID。

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
            }
        }
}

这意味着当您点击转发器中的按钮时,您现在可以在后面的代码中触发此事件。

答案 2 :(得分:0)

根据TheAlbear发布的内容,我在事件处理程序中想出了这个。

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

我不知道使用索引是否可靠。