【问题标题】:How to get the bound item from within an ASP.NET repeater如何从 ASP.NET 中继器中获取绑定项
【发布时间】:2010-06-23 12:18:58
【问题描述】:

我必须设置 LinkBut​​ton 的 OnClientClick 属性,但在绑定 LinkBut​​ton 之前我不知道这个值是什么。我正在尝试设置中继器绑定时的值,但我无法锻炼如何获取 'boundItem/dataContext' 值...

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:LinkButton  Text="HelloWorld" ID="Hyper1" runat="server" OnDataBinding="Repeater1_DataBinding" >
        </asp:LinkButton> 
    </ItemTemplate> 
</asp:Repeater>

protected void Page_Load(object sender, EventArgs e)
{
    var list = new List<TestObject>();
    list.Add(new TestObject() {TestValue = "testing1"});
    list.Add(new TestObject() { TestValue = "testing2" });
    list.Add(new TestObject() { TestValue = "testing3" });

    this.Repeater1.DataSource = list;
    this.Repeater1.DataBind();
}

public void Repeater1_DataBinding(object sender, EventArgs e)
{
    var link = sender as HyperLink;
    //link.DataItem ???
}

有没有办法找出当前的行绑定项是什么?

【问题讨论】:

    标签: c# asp.net data-binding repeater


    【解决方案1】:

    也许您需要使用 ItemDataBound 事件。它提供了具有 DataItem 可用的 RepeaterItemEventArgs 参数

    this.Repeater1.ItemDataBound += Repeater1_ItemDataBound;
    
    void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        var dataItem = e.Item.DataItem;
    }
    

    【讨论】:

    • 您可以将“var dataItem = ...”部分放在 if 语句中,以检查这是项目、页眉还是页脚记录。例如,如果 ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { ... }
    • DataBinding 是正确的事件,因为他想直接影响HyperLink 控件。听起来他不知道如何评估字段值以将其应用于HyperLink 控件。
    【解决方案2】:

    我假设您正在尝试获取当前正在数据绑定的行的值?

    您可以将您的功能更改为:

    public void Repeater1_DataBinding(object sender, EventArgs e) 
    { 
        var link = sender as HyperLink;
        string valueYouWant = Eval("TestValue").ToString();
    
        // You could then assign the HyperLink control to whatever you need
        link.Target = string.Format("yourpage.aspx?id={0}", valueYouWant);
    } 
    

    valueYouWant 现在具有正在数据绑定的当前行的字段 TestValue 的值。与ItemDataBound 相比,使用DataBinding 事件是执行此操作的最佳方式,因为您不必搜索控件并将代码专门定位到控件而不是整个模板。

    【讨论】:

      【解决方案3】:

      MSDN 库将此作为示例事件处理程序:

      public void BindData(object sender, EventArgs e)
      {
          Literal l = (Literal) sender;
          DataGridItem container = (DataGridItem) l.NamingContainer;
          l.Text = ((DataRowView) container.DataItem)[column].ToString();
      
      }
      

      (见http://msdn.microsoft.com/en-us/library/system.web.ui.control.databinding.aspx

      如您所见,这是一个简单的演示,演示了如何访问数据项并从中获取数据。将此适应您的场景是留给读者的练习。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多