在TextChanged上动态创建TextBox AutoPostBack但不调用事件函数

时间:2018-05-25 13:40:14

标签: c# asp.net webforms

大家,

我几天来一直试图解决这个问题但没有成功。 我在表格单元格中有文本框,这些文本框是在按钮点击时动态创建的。其中三个按钮将采用值,计算方法(%或Const值)和要分别应用的值。以下是在其他控件中创建这些TB的功能。

    protected void btnAddService_Click(object sender, EventArgs e)
{
    TableRow r = new TableRow();
    TableCell c0 = new TableCell();
    TableCell c1 = new TableCell();
    TableCell c2 = new TableCell();
    TableCell c3 = new TableCell();
    TableCell c4 = new TableCell();
    TableCell c5 = new TableCell();     // Management Fees (% or Const)
    TableCell c6 = new TableCell();     // Management Fees Value
    TableCell c7 = new TableCell();     // Remarks

    service s = new service();


    if (serCount == 0)
    {
        tblHeader.Visible = true;
    }


    // Add the Services DropDownList...
    DropDownList ddlS = new DropDownList();
    ddlS.ID = "ddlServices" + serCount;

    ddlS.Items.Add("Management");
    ddlS.Items.Add("MEP");
    ddlS.Items.Add("Landscaping");
    ddlS.Items.Add("Pest Control");
    ddlServices.Add(ddlS);
    ddlS.CssClass = "form-control";
    ddlS.Width = Unit.Percentage(100);

    c0.Controls.Add(ddlS);
    c0.Width = Unit.Percentage(15);

    s.serviceName = "Management";

    // Add Subcontracted Checkbox...
    CheckBox chkSubCont = new CheckBox();

    chkSubCont.ID = "chkSubCont" + serCount;
    chkSubContracted.Add(chkSubCont);

    c1.Controls.Add(chkSubCont);
    c1.Width = Unit.Percentage(5);
    c1.HorizontalAlign = HorizontalAlign.Center;

    s.subcontracted = false;

    // Add Subcontracted Value...
    TextBox txtSubContVal = new TextBox();
    txtSubContVal.ID = "txtSubcontractVal" + serCount;
    txtSubContVal.CssClass = "form-control";
    txtSubContVal.Attributes.Add("placeholder", "0.000");
    txtSubContVal.Style.Add("text-align", "right");
    txtSubcontValue.Add(txtSubContVal);

    c2.Controls.Add(txtSubContVal);
    c2.Width = Unit.Percentage(10);

    s.subcontValue = 0;

    // Add Management Fees Type (% or Const)...
    DropDownList ddlMFT = new DropDownList();
    ddlMFT.Items.Add("%");
    ddlMFT.Items.Add("Value");
    ddlMFT.CssClass = "form-control";
    ddlMFT.Width = Unit.Percentage(100);
    ddlMFT.ID = "ddlManFeesType" + serCount;
    ddlManFeesType.Add(ddlMFT);

    c5.Controls.Add(ddlMFT);
    c5.Width = Unit.Percentage(5);

    // Add Management Fees Value...
    TextBox txtMFVal = new TextBox();
    txtMFVal.CssClass = "form-control";
    txtMFVal.Attributes.Add("placeholder", "0.000");
    txtMFVal.Style.Add("text-align", "right");
    txtMFVal.Width = Unit.Percentage(100);
    //  txtMFVal.ID = "txtManFeesValue" + serCount;
    txtMFVal.AutoPostBack = true;
    txtMFVal.TextChanged += new EventHandler(txtManFeesVal_TextChange);
    txtManFeesValue.Add(txtMFVal);

    c6.Controls.Add(txtMFVal);
    c6.Width = Unit.Percentage(10);

    // Add Manpower Value...
    TextBox txtManp = new TextBox();
    txtManp.ID = "txtManpower" + serCount;
    txtManp.CssClass = "form-control";
    txtManp.Attributes.Add("placeholder", "0");
    txtManp.Style.Add("text-align", "center");

    txtManPower.Add(txtManp);

    c3.Controls.Add(txtManp);
    c3.Width = Unit.Percentage(10);

    s.manPower = 0;

    // Add Quoted Value...
    TextBox txtQuotVal = new TextBox();
    txtQuotVal.ID = "txtQuotedValue" + serCount;
    txtQuotVal.CssClass += "form-control";
    // txtQuotVal.Text = "0.000";
    txtQuotVal.Attributes.Add("placeholder", "0.000");
    txtQuotVal.Style.Add("text-align", "right");
    txtQuotVal.AutoPostBack = true;
    txtQuotVal.ClientIDMode = ClientIDMode.Static;
    txtQuotVal.TextChanged += (o, ep) => {
        TextBox t = sender as TextBox;

        if (t.Text == "")
        {
            t.Text = "0.000";
        }

        txtPrjValue.Text = (int.Parse(txtPrjValue.Text) + int.Parse(t.Text)).ToString();
    };

    txtQuotValue.Add(txtQuotVal);

    c4.Controls.Add(txtQuotVal);
    c4.Width = Unit.Percentage(10);

    // Add Remarks Box...
    TextBox txtRem = new TextBox();
    txtRem.ID = "txtRemarks" + serCount;
    txtRem.CssClass += "form-control";
    txtRem.ClientIDMode = ClientIDMode.Static;
    txtRem.Width = Unit.Percentage(100);
    txtRemarks.Add(txtRem);

    c7.Controls.Add(txtRem);
    c7.Width = Unit.Percentage(35);

    s.quotedValue = 0;

    // Add the cells to the new row...
    r.Cells.Add(c0);
    r.Cells.Add(c1);
    r.Cells.Add(c2);
    r.Cells.Add(c5);
    r.Cells.Add(c6);
    r.Cells.Add(c3);
    r.Cells.Add(c4);
    r.Cells.Add(c7);

    // Add the new row...
    tblServices.Rows.Add(r);

    serCount++;

    // Postback to refresh contents from Server Side...
    string scriptRefresh = "document.getElementById('" + btnASPClickMe.ClientID + "').click();";
    Page.ClientScript.RegisterStartupScript(typeof(Page), "refreshscript", scriptRefresh, true);
}

在txtMFVal文本的TextChanged上,它执行PostBack但它没有调用附加的事件处理程序,如下所示:

    protected void txtManFeesVal_TextChange(object sender, EventArgs e)
{
    TextBox txtMFV = sender as TextBox;

    // Get the parent cell of the TextBox...
    TableRow tr = txtMFV.Parent.Parent as TableRow;
    TextBox txtSCV = tr.Cells[2].Controls[0] as TextBox;
    TextBox txtMFT = tr.Cells[5].Controls[0] as TextBox;
    double scv = Double.Parse(txtSCV.Text);
    double mfv = Double.Parse(txtMFV.Text);
    double v = 0;

    if (txtMFT.Text == "%")
    {
        v = (scv * mfv) / 100;
    }
    else
    {
        v = scv + mfv;
    }

    TextBox txtQP = tr.Cells[6].Controls[0] as TextBox;
    txtQP.Text = v.ToString();

    // Postback to refresh contents from Server Side...
    string scriptRefresh = "document.getElementById('" + btnASPClickMe.ClientID + "').click();";
    Page.ClientScript.RegisterStartupScript(typeof(Page), "refreshscript", scriptRefresh, true);

}

我已经尝试过在网上找到的许多技巧,但都没有奏效。 请帮忙。

谢谢,

0 个答案:

没有答案