【问题标题】:How to fill the text box with value of a column of a GridView row如何用 GridView 行的列的值填充文本框
【发布时间】:2013-07-17 11:55:41
【问题描述】:

在网格中我有以下列

<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>

请告诉,在网格中如果我选择了一个复选框,金额值应该显示在同一行的文本框中。如果我选中了多个复选框,则值应显示在相关复选框/行的文本框中。总和应显示在网格下方的文本框中。我应该在“OnSelect_CheckedChanged”事件下写什么?

【问题讨论】:

  • 我会使用FooterTemplate 作为您的总行数。什么是“同一行的总量”?一行中有多个值吗?
  • 嗨蒂姆,我的意思是如果我选择了第一列的复选框,它应该在最后一列的文本框中显示金额。如果我选中了多个复选框,则这些金额应显示在相关文本框中,它们的行和总和应显示在底部文本框中。请帮我。提前谢谢..
  • 我仍然对您的要求感到困惑。我在您的代码中只看到一个 CheckBox,但您正在谈论检查多个。另一个复选框是在我们的网格中还是在它之外?也许您可以添加一些示例(屏幕截图,或者更多标记,或者只是更清晰的书面解释)。

标签: asp.net gridview


【解决方案1】:

请尝试以下代码 sn-p。

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);
    }


}

【讨论】:

  • 如果网格中的数据是动态生成的呢。
  • 是的,我正在使用 c# 代码从数据库中动态填充网格。然后按照我上面解释的那样处理功能。从您提到的上述代码中,我没有在 TotalAmount 等变量中获得任何值。
  • 我已经更新了上面的代码sn-p。请检查一下,如果有任何问题,请告诉我。
  • 感谢 Jayesh 的帮助。我得到了一些简化的解决方案,我在下面发布并标记为答案。
【解决方案2】:

你的意思是网格中有一个复选框和一个文本框列的行?每行包含一个复选框和代码中提到的其他列值和一个文本框?请附上图片/截图。

【讨论】:

  • 是的,网格中有行,每行包含一个复选框和其他值,例如 Invoice、Date、Amount。如果我选择网格行的复选框,我应该在同一行的文本框中显示金额。如果我选择多行(复选框),我应该在相关行的文本框中显示它们的金额值,并且所有文本框的总和都应该显示在底部的文本框中。
【解决方案3】:

我想用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);
        }
    });

【讨论】:

    【解决方案4】:

    在 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");}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2013-11-01
      • 2015-08-02
      • 2023-03-12
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多