数据绑定中继器中的项目上的事件不会触发

时间:2011-11-11 21:50:05

标签: c# asp.net data-binding

来源第一:

Default.aspx的:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="Bars" runat="server">
            <ItemTemplate>
                <div>
                    <asp:TextBox ID="Name" Text='<%# Eval("Name") %>' runat="server" AutoPostBack="true" />
                    <asp:TextBox ID="Description" Text='<%# Eval("Description") %>' runat="server" AutoPostBack="true" />
                </div>
            </ItemTemplate>
        </asp:Repeater>
        <asp:Button ID="AddBar" Text="Add Bar" runat="server" onclick="AddBar_Click" />
    </div>
    </form>
</body>
</html>

Default.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public class Foo
    {
        public string Widget { get; set; }
        public string Cog { get; set; }
        public List<Bar> Bars { get; set; }
    }

    public class Bar
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }

    public partial class Default : System.Web.UI.Page
    {
        public Foo Foo
        {
            get
            {
                var retval = Session["Foo"];
                if (retval == null)
                {
                    retval = new Foo();
                    Session["Foo"] = retval;
                }
                return retval == null ? new Foo() : (Foo)retval;
            }
            set
            {
                Session["Foo"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var f = new Foo() { Bars = new List<Bar>(), Cog = "Cog one", Widget = "Widget Master" };
                f.Bars.Add(new Bar() { Name = "Bar one", Description = "hello." });
                Foo = f;
                Bind();
            }
        }

        protected void Bars_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item != null && e.Item.DataItem != null)
            {
                var b = e.Item.DataItem as Bar;
                var Name = e.Item.FindControl("Name") as TextBox;
                var Description = e.Item.FindControl("Description") as TextBox;
                Name.TextChanged += new EventHandler(Name_TextChanged);
            }
        }

        protected void Name_TextChanged(object sender, EventArgs e)
        {
            var Name = sender as TextBox;
            var listItem = Name.Parent as RepeaterItem;
            var f = Foo;
            var b = f.Bars[listItem.ItemIndex];
            b.Name = Name.Text;
            Foo = f;
            Bind();
        }

        protected void AddBar_Click(object sender, EventArgs e)
        {
            var f = Foo;
            f.Bars.Add(new Bar());
            Foo = f;
            Bind();
        }

        private void Bind()
        {
            Bars.ItemDataBound += new RepeaterItemEventHandler(Bars_ItemDataBound);
            Bars.DataSource = Foo.Bars;
            Bars.DataBind();
        }
    }
}

现在,我多年没有使用过数据绑定了,所以我想我会刷新记忆,但我无法让它工作。当我启动应用程序时,我看到一个带有我期望值的条目。如果单击“添加”,则会显示新值并保留现有值。

问题在于:当我更改名称文本框中的值时,我可以看到页面刷新,但我的Name_TextChanged事件并没有中断。由于它没有发射,因此价值可以追溯到以前的水平。

1 个答案:

答案 0 :(得分:2)

在aspx中附加OnTextChanged事件。以下代码有效。

protected void Bars_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item != null && e.Item.DataItem != null)
    {
        var b = e.Item.DataItem as Bar;
        var Name = e.Item.FindControl("Name") as TextBox;
        var Description = e.Item.FindControl("Description") as TextBox;
        // Commented
        // Name.TextChanged += new EventHandler(Name_TextChanged);
    }
}

<asp:TextBox ID="Name" Text='<%# Eval("Name") %>' runat="server" 
AutoPostBack="true" OnTextChanged="Name_TextChanged" /> 

<asp:TextBox ID="Description" Text='<%# Eval("Description") %>' 
runat="server" AutoPostBack="true" OnTextChanged="Name_TextChanged" />
相关问题