Событие TextChanged запускается, но не выполняется в коде позади - PullRequest
1 голос
/ 03 мая 2020

В моем файле aspx у меня есть следующий код:

    <asp:PlaceHolder ID="phdHolding" runat="server">
        <asp:Label ID="lblWarning" runat="server" Text="" Visible="false" />
        <asp:PlaceHolder ID="phdInput" runat="server" Visible="false">
            <h3><asp:Label ID="lblArea" runat="server" Text="Area" /></h3>
        </asp:PlaceHolder>
    </asp:PlaceHolder>

В коде (c#) я создаю таблицу, которая добавляется в phdInput. Одной частью этого кода является создание и размещение TextBox (и метки) в ячейке таблицы. TextBox требуется для вызова функции TextChanged.

     decimal amount = Convert.ToDecimal(dc.DataScalar("SELECT Item" + rownr + " FROM Companies WHERE CompanyName='" + coy + "' AND BusinessUnit='" + bu + "'"));
     TextBox tb = new TextBox(); tb.ID = "txtAmount" + rownr; tb.Width = 70; tb.Text = amount.ToString("N0");
     tb.AutoPostBack = true; tb.TextChanged += new EventHandler(UpdateAmounts);
     Label lbl = new Label(); lbl.Text= " " + trow["Unit"].ToString();
     TableCell tdamount = new TableCell(); tdamount.Controls.Add(tb); tdamount.Controls.Add(lbl); 
     tr2.Cells.Add(tdamount);

Это все работает нормально, и все отображается на странице. Однако, когда текст изменяется и вы щелкаете за пределами текстового поля или нажимаете Enter, et c. функция не достигается (проверил в VS) и phdInput становится пустым.

Я использовал эту функцию и метод TextChanged для ее вызова раньше, без проблем, так почему же она не работает сейчас?

1 Ответ

0 голосов
/ 04 мая 2020

Мне удалось воссоздать одну проблему

phdInput становится пустым

Это было подозрительно, если оно исчезает, должно быть PostBack в действии. Подозрение возрастает особенно потому, что атрибут phdInput Visible установлен в форме false.

Я полагаю, инициализация формы происходит внутри метода Page_Load, а один из кодов за строками должен быть установлен phdInput атрибут Visible до true. Тем не менее, phdInput исчезает после запуска PostBack, поэтому, возможно, есть проверка

if (!IsPostBack)

Внутри него происходит инициализация, и это правильно, нет необходимости инициализировать ее каждый раз при перезагрузке страницы. Однако

phdInput.Visible = true;

должно быть вне проверки if (!IsPostBack), чтобы phdInput всегда было видно.

Затем что-то запускает PostBack.

Однако, когда текст изменяется и вы щелкаете за пределами текстового поля или , нажимаете 'Enter' и т. Д. c. , функция не достигается (проверили в VS) и phdInput становится пустым.

Это звучит как TextChanged событие работает, оно вызывает только какой-то другой обработчик события.

Я надеюсь, что это поможет вам найти решение. Далее следует код, воссоздающий проблему phdInput становится пустым (плохо написано).

.aspx - содержимое тега body

<form id="form1" runat="server">
    <div>
        <p>start</p>

        <asp:PlaceHolder ID="phdHolding" runat="server">
            <asp:Label ID="lblWarning" runat="server" Text="" Visible="false" />
            <asp:PlaceHolder ID="phdInput" runat="server" Visible="false" >
                <h3><asp:Label ID="lblArea" runat="server" Text="Area" /></h3>
            </asp:PlaceHolder>
        </asp:PlaceHolder>

        <p>end</p>
    </div>
</form>

код позади

using System;
using System.Web.UI.WebControls;

namespace WebApplication8
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    // row 1
                    int rownr = Convert.ToInt32(1);
                    TableRow tr = new TableRow();
                    tr.VerticalAlign = VerticalAlign.Top;
                    TableCell tdtype = new TableCell();
                    tdtype.Text = "table cell 1 text";
                    tdtype.Width = 250;
                    tdtype.HorizontalAlign = HorizontalAlign.Left;
                    tr.Cells.Add(tdtype);

                    decimal amount = Convert.ToDecimal(1);
                    TextBox tb = new TextBox(); tb.ID = "txtAmount" + rownr; tb.Width = 70; tb.Text = amount.ToString("N0");
                    tb.AutoPostBack = true; tb.TextChanged += new EventHandler(UpdateAmounts);
                    Label lbl = new Label(); lbl.Text = " " + "1";
                    TableCell tdamount = new TableCell(); tdamount.Controls.Add(tb); tdamount.Controls.Add(lbl);
                    tr.Cells.Add(tdamount);

                    // row 2
                    int rownr2 = Convert.ToInt32(2);
                    TableRow tr2 = new TableRow();
                    tr2.VerticalAlign = VerticalAlign.Top;
                    TableCell tdtype2 = new TableCell();
                    tdtype2.Text = "table cell 2 text";
                    tdtype2.Width = 250;
                    tdtype2.HorizontalAlign = HorizontalAlign.Left;
                    tr2.Cells.Add(tdtype2);

                    decimal amount2 = Convert.ToDecimal(2);
                    TextBox tb2 = new TextBox(); tb2.ID = "txtAmount" + rownr2; tb2.Width = 70; tb2.Text = amount2.ToString("N0");
                    tb2.AutoPostBack = true; tb2.TextChanged += new EventHandler(UpdateAmounts);
                    Label lbl2 = new Label(); lbl2.Text = " " + "2";
                    TableCell tdamount2 = new TableCell(); tdamount2.Controls.Add(tb2); tdamount2.Controls.Add(lbl2);
                    tr2.Cells.Add(tdamount2);

                    // table
                    var table = new Table();
                    table.Rows.Add(tr);
                    table.Rows.Add(tr2);
                    phdInput.Controls.Add(table);

                    lblWarning.Text = "some warning";
                    lblArea.Text = "some area text";

                    lblWarning.Visible = true;
                    phdInput.Visible = true;
                }
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
        }

        protected void UpdateAmounts(object sender, EventArgs e)
        {

        }
    }
}

при открытии страницы

enter image description here

после текстовое поле текст изменяется - либо один

enter image description here

...