2011-05-18 224 views
1

我在UpdatePanel中有一個databound網格視圖。TextBox TextChanged GridView中沒有觸發的事件

在使用for循環動態創建的模板字段中有文本框。 我有一個textChange事件與每個文本框相關聯,但事件沒有被解僱。 請幫我一把。

這裏的ASP代碼:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <table width="100%"> 
     <%--table for the grid view of buttons--%> 
     <tr> 
      <td align="center"> 
       <asp:GridView ID="gvJV" runat="server" AutoGenerateColumns="False" 
        Height="100%" Width="749px" > 
        <Columns> 
         <asp:TemplateField HeaderText="Account"> 
          <ItemTemplate> 
           <ajaxToolkit:ComboBox ID="AccountId" runat="server" AutoPostBack="false"> 
           </ajaxToolkit:ComboBox> 
           <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="AccountId" 
            Display="Dynamic" ErrorMessage="Select Account" ForeColor="Red" InitialValue="-1">*</asp:RequiredFieldValidator> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:ImageButton ID="btnSelect" runat="server" ImageUrl="~/images/icons/edit.png" AutoPostBack="false" 
            ImageAlign="AbsMiddle" OnClientClick='hdCallerRowID.value = this.parentElement.parentElement.rowIndex-1;' /> 
           <ajaxToolkit:ModalPopupExtender ID="gv_ModalPopupExtender" runat="server" TargetControlID="btnSelect" 
            PopupControlID="pnlSelectCOA" CancelControlID="btnCancel" BackgroundCssClass="modalBackground"> 
           </ajaxToolkit:ModalPopupExtender> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Memo"> 
          <ItemTemplate> 
           <asp:TextBox ID="txtMemo" runat="server" BorderStyle="None" AutoPostBack="false"></asp:TextBox> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Debit"> 
          <ItemTemplate> 
           <asp:TextBox ID="txtDebit" runat="server" AutoPostBack="false" OnTextChanged="txtDebit_textChanged" comm></asp:TextBox> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Credit"> 
          <ItemTemplate> 
           <asp:TextBox ID="txtCredit" AutoPostBack="false" EnableViewState="true" runat="server" OnTextChanged="txtDebit_textChanged"></asp:TextBox> 
          </ItemTemplate> 
         </asp:TemplateField> 
        </Columns> 
       </asp:GridView> 
      </td> 
     </tr> 
    </table> 
</asp:UpdatePanel> 

和這裏的代碼在後端

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using ERP.Controller; 
using System.Data; 
using AjaxControlToolkit; 
using MERP.WebUI.Code; 
using ERP.Properties; 

namespace MERP.WebUI.Account.GL 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       txtCalendar_CalendarExtender.SelectedDate = DateTime.Now.Date; 

       BindGrid(); 
      } 
     } 

     private void BindGrid() 
     { 
      DataTable dt = new DataTable(); 

      dt.Columns.Add("Dummy"); 

      for (int i = 0; i < 10; i++) 
       dt.Rows.Add(""); 

      dt.AcceptChanges(); 

      gvJV.DataSource = dt; 
      gvJV.DataBind(); 
     } 



     private void SaveForm() 
     { 
      int debitTotal = 0; 
      int creditTotal = 0; 

      foreach (GridViewRow gvRow in gvJV.Rows) 
      { 

       TextBox txtDebit = (TextBox)gvRow.FindControl("txtDebit"); 
       if (txtDebit.Text != string.Empty) 
        debitTotal += Convert.ToInt32(txtDebit.Text.Trim()); 
       TextBox txtCredit = (TextBox)gvRow.FindControl("txtCredit"); 
       if (txtCredit.Text != string.Empty) 
        creditTotal += Convert.ToInt32(txtCredit.Text.Trim()); 
      } 

      if (debitTotal != creditTotal) 
       ((Authenticated)Master).SetMessage("NOT EQUAL"); 
      else 
       ((Authenticated)Master).SetMessage("done successfully"); 
     } 

     protected void gvJV_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       ComboBox AccountId = (ComboBox)e.Row.FindControl("AccountId"); 
       Common.BindAccounts(AccountId); 
       TextBox txtMemo = (TextBox)e.Row.FindControl("txtMemo"); 

      } 
     } 

     protected void txtDebit_textChanged(object sender, EventArgs e) 
     { 
      GridViewRow row = ((GridViewRow)((TextBox)sender).NamingContainer); 
      //NamingContainer return the container that the control sits in 
      TextBox other = (TextBox)row.FindControl("txtCredit"); 
      other.Text = ""; 
     } 

     protected void btnCancel_Click(object sender, EventArgs e) 
     { 

     } 

     protected void btnSave_Click(object sender, EventArgs e) 
     { 
      SaveForm(); 
     } 

    } 
} 

回答

2

我有同樣的問題。我通過將TextBox的AutoPostBack設置爲true來解決它。因此代碼應該是:

<ItemTemplate> 
    <asp:TextBox ID="txtMemo" runat="server" AutoPostBack="true"></asp:TextBox> 
</ItemTemplate> 
相關問題