为什么当新文本为空时,ASP.NET TextBox.TextChanged不会触发?

时间:2015-03-18 00:49:32

标签: c# asp.net events

我有一个有点复杂的ASP.NET TextBox设置。它位于转发器内部的转发器内部的用户控件内部。

我能够将文本加载到TextBox中,并且当文本更改为除空白/空之外的任何内容时,也可以触发TextChanged。当用户清除TextBox时,事件不会触发。

有谁知道为什么ASP.NET可能会区分文本和空白?

我制作了问题的简化版本,将其与其他可能的因素区分开来。我得到了相同的结果。

以下是我的aspx标记:

    <div>
        <asp:Repeater runat="server" ID="rptRepeat" EnableViewState="False">
            <ItemTemplate>
                <asp:repeater runat="server" ID="rptChild" EnableViewState="False">
                    <ItemTemplate>
                        <uc:Things runat="server" ID="ucChild"></uc:Things>
                    </ItemTemplate>
                </asp:repeater>        
            </ItemTemplate>
        </asp:Repeater>
    </div>
    <asp:Button runat="server" ID="btnBtn" Text="click"/>

以下是我的用户控制标记

<asp:TextBox runat="server" ID="txtText"></asp:TextBox>

下面是

背后的aspx代码
    private List<List<TestObj>> data = null;

    protected void Page_Init(object sender, EventArgs e)
    {
        this.rptRepeat.ItemCreated += rptRepeat_ItemCreated;
        this.rptRepeat.ItemDataBound += rptRepeat_ItemDataBound;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            Session["data"] = data = new List<List<TestObj>>();

            for (var x = 0; x < 5; x++)
            {
                data.Add(new List<TestObj>());

                for (var y = 0; y < 5; y++)
                {
                    data[0].Add(new TestObj
                    {
                        Text = x + "_" + y
                    });
                }
            }
        }
        else
        {
            data = (List<List<TestObj>>)Session["data"];
        }

        this.rptRepeat.DataSource = data;
        this.rptRepeat.DataBind();
    }


    void rptRepeat_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        var rptChild = (Repeater)e.Item.FindControl("rptChild");

        rptChild.ItemDataBound += rptChild_ItemDataBound;
    }

    void rptRepeat_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        var rptChild = (Repeater)e.Item.FindControl("rptChild");
        var rowObj = (List<TestObj>)e.Item.DataItem;

        rptChild.DataSource = rowObj;
        rptChild.DataBind();
    }

    void rptChild_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        var ucChild = (WebUserControl1)e.Item.FindControl("ucChild");
        var rowObj = (TestObj)e.Item.DataItem;

        ucChild.data = rowObj;
    }

以下是

背后的用户控制代码
    public TestObj data = null;

    protected void Page_Init(object sender, EventArgs e)
    {
        this.txtText.TextChanged += txtText_TextChanged;
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        this.txtText.Text = data.Text;
    }

    void txtText_TextChanged(object sender, EventArgs e)
    {
        data.Text = this.txtText.Text;
    }

您可以在https://www.dropbox.com/s/p6zkqqsw71fvuyw/textchangetest.zip?dl=0下载整个项目,如果您想尝试修改内容以获得答案。

有意将转发器的数据绑定放在Page_Load中,因为否则子控件的事件不会触发。

0 个答案:

没有答案