2013-07-17 40 views
2

在網格中的一列的值填充文本框中我有以下列如何與一個GridView列

<Columns> 
    <asp:TemplateField HeaderText="select to pay"> 
     <ItemTemplate> 
      <asp:CheckBox ID="chkSelect" runat="server" OnCheckedChanged="chkSelect_OnCheckedChanged" AutoPostBack="true" /> 
     </ItemTemplate>    
    </asp:TemplateField> 

    <asp:BoundField DataField="Reference" HeaderText="Invoice" HeaderStyle-HorizontalAlign="Center" 
     ItemStyle-HorizontalAlign="Center">   
    </asp:BoundField> 

    <asp:BoundField DataField="ChargedDate" HeaderText="Date of charge" HeaderStyle-HorizontalAlign="Center" 
     ItemStyle-HorizontalAlign="Center" DataFormatString="{0:MM-dd-yyyy}">    
    </asp:BoundField> 

    <asp:BoundField DataField="Amount" HeaderText="Amount" HeaderStyle-      HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center"> 
     </asp:BoundField>  
    <asp:TemplateField HeaderText="Amount applied"> 
     <ItemTemplate> 
      <asp:TextBox ID="txtPayAmount" Width="80px" runat="server" AutoPostBack="true" /> 
     </ItemTemplate> 
     <ItemStyle HorizontalAlign="Center" /> 

    </asp:TemplateField> 
</Columns> 

enter image description here 請告訴,在網格中,如果我選擇了一個複選框,量值應顯示在同一行的文本框中。如果我選中了多個複選框,則值應顯示在相關複選框/行的文本框中。總和應顯示在網格下面的文本框中。我應該在「OnSelect_CheckedChanged」事件下寫什麼?

+3

我會用'FooterTemplate'你總一行。什麼意思是「同一排的總量」?一行中是否有多個值? –

+0

您好Tim,我的意思是如果我選擇了第一列的複選框,它應該在最後一列的文本框中顯示數量。如果我選中了多個複選框,則應在相關文本框中顯示這些金額,它們的行和總和應顯示在底部文本框中。請幫幫我。在此先感謝.. – Sanjeev4evr

+0

我仍然對你問的問題感到困惑。我在你的代碼中只看到一個CheckBox,但你說的是檢查多個CheckBox。另一個checkBox是在我們的網格中,還是在它之外?也許你可以添加一些例子(屏幕截圖,或更多的標記,或只是一個更清晰的書面解釋)。 – jadarnel27

回答

0

在OnCheckedChanged事件應該是

protected void chkSelect_OnCheckedChanged(object sender, EventArgs e) 
{ 
    String czTemp = String.Empty; 
    GridViewRow gr = (GridViewRow)((CheckBox)sender).Parent.Parent; 
    GridViewRow footer = grdDues.FooterRow; 

    TextBox txtAmount = (TextBox)gr.Cells[3].FindControl("txtPayAmount"); 
    TextBox txtAmountPaid = (TextBox)footer.FindControl("txtAmountPaid"); 
    double dbTotalAmt = Convert.ToDouble(txtAmountPaid.Text.Replace("$","").ToString()); 
    if(((CheckBox)sender).Checked) 
    { 
     txtAmount.Enabled = true; 
     czTemp = grdDues.Rows[gr.RowIndex].Cells[3].Text.ToString(); 
     txtAmount.Text = czTemp.ToString(); 
     dbTotalAmt = dbTotalAmt + Convert.ToDouble(czTemp); 
    } 
    else 
    { 
     txtAmount.Enabled = false; 
     czTemp = grdDues.Rows[gr.RowIndex].Cells[3].Text.ToString(); 
     dbTotalAmt = dbTotalAmt - Convert.ToDouble(czTemp); 
     txtAmount.Text = "0.00"; 
    } 
    txtAmountPaid.Text = dbTotalAmt.ToString("C");} 
0

你的意思是網格中有一行有一個複選框和一個文本框列?每行都包含一個複選框和其他列值,如代碼和文本框中所述?請附上圖片/屏幕截圖。

+0

是的,網格中有行,每行包含一個複選框和其他值,如發票,日期,金額。如果我選擇網格行的複選框,我應該在同一行的文本框中顯示數量。如果我選擇多行(複選框),我應該在其相關行的文本框中顯示其數量值,並且所有文本框的總和應顯示在底部的文本框中。 – Sanjeev4evr

1

請嘗試使用下面的代碼片段。

ASPX

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" DataKeyNames="TotalAmount" ShowFooter="true"> 
    <Columns> 
     <asp:TemplateField HeaderText="select to pay"> 
      <ItemTemplate> 
       <asp:CheckBox ID="chkSelect" runat="server" OnCheckedChanged="chkSelect_OnCheckedChanged" 
        AutoPostBack="true" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Amount"> 
      <ItemTemplate> 
       <%# Eval("TotalAmount", "{0:#,##0.00}")%> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Amount applied"> 
      <ItemTemplate> 
       <asp:TextBox ID="txtPayAmount" Width="80px" runat="server" /> 
      </ItemTemplate> 
      <FooterTemplate> 
       <asp:TextBox ID="TextBox1" Width="80px" runat="server" /> 
      </FooterTemplate> 
      <ItemStyle HorizontalAlign="Center" /> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

ASPX.CS

public partial class Forum : System.Web.UI.Page 
{ 

    protected void Page_Init(object sender, System.EventArgs e) 
    { 
     GridView gv = new GridView(); 
     gv.ID = "GridView1"; 
     gv.AutoGenerateColumns = false; 
     gv.ShowFooter = true; 
     gv.DataKeyNames = new string[] { "TotalAmount" }; 

     TemplateField tf = new TemplateField(); 
     tf.ItemTemplate = new MyCustomTemplate(); 
     gv.Columns.Add(tf); 

     BoundField bf = new BoundField(); 
     bf.DataField = "TotalAmount"; 
     gv.Columns.Add(bf); 

     tf = new TemplateField(); 
     tf.ItemTemplate = new MyCustomTextTemplate(); 
     tf.FooterTemplate = new MyCustomFooterTextTemplate(); 
     gv.Columns.Add(tf); 

     this.form1.Controls.Add(gv); 
    } 

    protected void Page_Load(object sender, System.EventArgs e) 
    { 
     GridView gv = form1.FindControl("GridView1") as GridView; 
     if (!IsPostBack) 
     { 
      dynamic data = new[] { 
     new { ID = 1, Name = "Name1",TotalAmount= 10}, 
     new { ID = 2, Name = "Name2",TotalAmount= 20}, 
     new { ID = 3, Name = "Name3",TotalAmount= 30}, 
     new { ID = 4, Name = "Name4",TotalAmount= 40}, 
     new { ID = 5, Name = "Name5",TotalAmount= 50} 
    }; 

      gv.DataSource = data; 
      gv.DataBind(); 
     } 
    } 

    protected void Page_PreRender(object sender, System.EventArgs e) 
    { 

    } 


    protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e) 
    { 
     dynamic data = new[] { 
       new { ID = 1, Name ="Name_1"}, 
       new { ID = 2, Name = "Name_2"}, 
       new { ID = 3, Name = "Name_3"}, 
       new { ID = 4, Name = "Name_4"}, 
       new { ID = 5, Name = "Name_5"} 
      }; 


    } 



} 

public class MyCustomTemplate : ITemplate 
{ 
    public void InstantiateIn(System.Web.UI.Control container) 
    { 
     CheckBox cb = new CheckBox(); 
     cb.ID = "chkSelect"; 
     cb.AutoPostBack = true; 
     cb.CheckedChanged += new EventHandler(cb_CheckedChanged); 
     container.Controls.Add(cb); 
    } 

    protected void cb_CheckedChanged(object sender, EventArgs e) 
    { 
     GridViewRow row = (sender as CheckBox).NamingContainer as GridViewRow; 
     TextBox txtPayAmount = row.FindControl("txtPayAmount") as TextBox; 

     if ((sender as CheckBox).Checked) 
     { 
      txtPayAmount.Text = Convert.ToString((row.Parent.Parent as GridView).DataKeys[row.RowIndex]["TotalAmount"]); 
     } 
     else 
     { 
      txtPayAmount.Text = string.Empty; 
     } 

     int TotalAmount = 0; 

     foreach (GridViewRow rowv in (row.Parent.Parent as GridView).Rows) 
     { 
      CheckBox chk = rowv.FindControl("chkSelect") as CheckBox; 
      if (chk.Checked) 
      { 
       TotalAmount += Convert.ToInt32((row.Parent.Parent as GridView).DataKeys[rowv.RowIndex]["TotalAmount"]); 
      } 
     } 

     GridViewRow rowf = (row.Parent.Parent as GridView).FooterRow; 

     ((TextBox)rowf.FindControl("TextBox1")).Text = TotalAmount.ToString(); 
    } 
} 

public class MyCustomTextTemplate : ITemplate 
{ 
    public void InstantiateIn(System.Web.UI.Control container) 
    { 
     TextBox cb = new TextBox(); 
     cb.ID = "txtPayAmount"; 
     container.Controls.Add(cb); 
    } 


} 

public class MyCustomFooterTextTemplate : ITemplate 
{ 
    public void InstantiateIn(System.Web.UI.Control container) 
    { 
     TextBox cb = new TextBox(); 
     cb.ID = "TextBox1"; 
     container.Controls.Add(cb); 
    } 


} 
+0

如果網格中的數據是動態生成的,該怎麼辦? – Sanjeev4evr

+0

意思是你想用C#代碼創建網格,對吧? –

+0

是的,我使用C#代碼動態地從數據庫填充網格。然後按照上面的解釋處理功能。從你提到的上述代碼中,我沒有得到像TotalAmount這樣的變量的任何值。 – Sanjeev4evr

0

我想要使用JavaScript,那麼請試試這個去做。

 $(function() { 
     $('input:checkbox').click(function (e) { 
      calculateSum(5); // sum of 5th column 
     }); 

     function calculateSum(colidx) { 
      total = 0.0; 
      $("tr:has(:checkbox:checked) td:nth-child(" + colidx + ")").each(function() { 
       var Tot = ($(this).text()); 
       Tot = parseFloat(Tot.replace(/,/g, '')); 
       total += Tot; 
      }); 
      $("#<%=txtTotalAmt.ClientID %>").val(total).toFixed(2); 
     } 
    }); 
相關問題