GridView中录入数量及单价的时候自动算出金额

本文介绍如何使用客户端脚本在DataGrid中实现数量与单价输入时自动计算金额的功能,并通过正则表达式验证确保输入为数值型。

 

DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE(金额)分别在5.6.7列,要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?

<asp:GridView ID="GridView1" runat="server" BackColor="White" BorderColor="#CC9966"

            BorderStyle="None" BorderWidth="1px" CellPadding="4" AutoGenerateColumns="False" Width="440px">

<Columns>

<asp:TemplateField HeaderText="数量">

 <ItemTemplate>

  <asp:TextBox id="ShuLiang" runat='server' Text='<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%>'

        onkeyup="javascrip:DoCal()"/>

  <asp:RegularExpressionValidator id="revS" runat="server"

           ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^/d+$" />

</ItemTemplate>

</asp:TemplateField>

<asp:TemplateField HeaderText="单价">

 <ItemTemplate>

  <asp:TextBox id="DanJian" runat='server' Text='<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%>' 

        onkeyup="javascrip:DoCal()"/>

  <asp:RegularExpressionValidator id="revS2" runat="server"

        ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^/d+(/./d*)?$" />

 </ItemTemplate>

</asp:TemplateField>

<asp:TemplateField HeaderText="金额">

 <ItemTemplate>

  <asp:TextBox id="JinE" runat='server' Text='<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%>'/>

 </ItemTemplate>

</asp:TemplateField>

 

 

</Columns>

</asp:gridview>

    </div>

    </form>

<script language="javascript">

function DoCal()

{

  var e = event.srcElement;

  var row = e.parentNode.parentNode;

  var txts = row.all.tags("INPUT");

  if (!txts.length || txts.length < 3)

     return;

  var q = txts[txts.length-3].value;

  var p = txts[txts.length-2].value;

  if (isNaN(q) || isNaN(p))

     return;

  q = parseInt(q);

  p = parseFloat(p);

  txts[txts.length-1].value = (q * p).toFixed(2);

}

</script>

### 实现单价乘以数量等于金额的动态计算 在 DevExpress 的 `GridView` 中实现单元格之间的动态计算功能,可以通过订阅事件来完成。以下是具体的实现方法: #### 1. 数据绑定与列定义 首先,在数据源中定义三个字段:`UnitPrice`(单价)、`Quantity`(数量 `Amount`(金额)。其中,`Amount` 是通过计算得出的结果。 ```csharp // 定义 DataTable 结构 DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("ProductName", typeof(string)); dt.Columns.Add("UnitPrice", typeof(decimal)); // 单价 dt.Columns.Add("Quantity", typeof(int)); // 数量 dt.Columns.Add("Amount", typeof(decimal)); // 计算后的金额 // 添加一些测试数据 dt.Rows.Add(1, "Product A", 10m, 5, 50m); dt.Rows.Add(2, "Product B", 20m, 3, 60m); gridControl1.DataSource = dt; ``` #### 2. 设置 GridView 列属性 为每列设置名称、标题以及可见性。 ```csharp DevExpress.XtraGrid.Views.Grid.GridView gridView = gridControl1.MainView as DevExpress.XtraGrid.Views.Grid.GridView; // 配置各列 gridView.Columns["UnitPrice"].Caption = "单价"; gridView.Columns["Quantity"].Caption = "数量"; gridView.Columns["Amount"].Caption = "金额"; // 将 Amount 列设为只读 gridView.Columns["Amount"].OptionsColumn.ReadOnly = true; ``` #### 3. 动态计算逻辑 为了实现实时更新金额的功能,需要监听 `CellValueChanging` `RowCellChanged` 事件。 ##### a. 处理 CellValueChanging 事件 当用户修改单元格值时触发此事件,用于验证输入并实时更新其他依赖项。 ```csharp private void gridView_CellValueChanging(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { if (e.Column.FieldName == "UnitPrice" || e.Column.FieldName == "Quantity") { decimal unitPrice = Convert.ToDecimal(gridView.GetRowCellValue(e.RowHandle, "UnitPrice") ?? 0); int quantity = Convert.ToInt32(gridView.GetRowCellValue(e.RowHandle, "Quantity") ?? 0); // 更新金额 gridView.SetRowCellValue(e.RowHandle, "Amount", unitPrice * quantity); } } ``` ##### b. 初始化 RowCellChanged 事件 如果某些情况下数据被重新加载,则需确保每次更改都能同步更新金额。 ```csharp private void gridView_RowCellChanged(object sender, DevExpress.XtraGrid.Views.Base.RowCellChangedEventArgs e) { if (e.Column.FieldName == "UnitPrice" || e.Column.FieldName == "Quantity") { decimal unitPrice = Convert.ToDecimal(gridView.GetRowCellValue(e.RowHandle, "UnitPrice") ?? 0); int quantity = Convert.ToInt32(gridView.GetRowCellValue(e.RowHandle, "Quantity") ?? 0); // 更新金额 gridView.SetRowCellValue(e.RowHandle, "Amount", unitPrice * quantity); } } ``` #### 4. 注册事件处理程序 最后,将上述两个事件注册到 `GridView` 上。 ```csharp gridView.CustomUnboundColumnData += gridView_CustomUnboundColumnData; gridView.CellValueChanging += gridView_CellValueChanging; gridView.RowCellChanged += gridView_RowCellChanged; ``` --- ### 注意事项 - 如果使用的是无界模式(Unbound Mode),则需要额外配置 `CustomUnboundColumnData` 来支持自定义列的数据填充[^1]。 - 确保所有涉及数值操作的地方都进行了异常捕获,防止非法输入引发错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值