Как получить столбец в GridView, вычисляемый на лету? - PullRequest
2 голосов
/ 26 января 2011

У меня есть следующий GridView:

<asp:GridView ID="gv" AutoGenerateColumns="false" runat="server">
        <Columns>
            <asp:BoundField DataField="productName" HeaderText="Item" />
            <asp:BoundField DataField="unitCost" HeaderText="Cost" DataFormatString="{0:c}" />
            <asp:BoundField DataField="originalCount" ItemStyle-HorizontalAlign="Center" HeaderText="Old Count" />          
            <asp:TemplateField HeaderText="New Count" ItemStyle-HorizontalAlign="Center" >
                <ItemTemplate>
                    <asp:TextBox ID="NewCount"  Width="20" runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>   
    </asp:GridView>

И я хочу добавить последний столбец «Всего», который вычисляет

(originalCount - NewCount) * unitCost

и обновляет его, когда пользователь вводит число в текстовое поле NewCount.

Могу ли я сделать это только с помощью .net или мне нужно использовать Java? Если последнее, как мне узнать, какую ячейку Gridview нужно обновить?

Заранее спасибо,

Ben

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Обновлено с новым кодом (старый ответ ниже)

Вам нужно использовать Javascript, чтобы делать то, что вы просите. Существует миллион различных способов, поэтому вам нужно изменить приведенный ниже код, чтобы он работал на вас.

Создайте свой GridView следующим образом:

<asp:GridView runat="server" ID="gv1" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="productName" HeaderText="Item" />
            <asp:TemplateField HeaderText="Cost">
                <ItemTemplate>
                    <asp:Label runat="server" ID="unitCost" Text='<%# String.Format("{0:c}",Eval("unitCost")) %>'/>
                </ItemTemplate>
            </asp:TemplateField> 
            <asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderText="Old Count">
                <ItemTemplate>
                    <asp:Label runat="server" ID="originalCount" Text='<%# Bind("originalCount") %>' />
                </ItemTemplate>
            </asp:TemplateField>         
            <asp:TemplateField HeaderText="New Count" ItemStyle-HorizontalAlign="Center" >
                <ItemTemplate>
                    <asp:TextBox ID="NewCount"  Width="20" runat="server" onblur="javascript:GetTotal(this);"  />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Total" ItemStyle-HorizontalAlign="Center" >
                <ItemTemplate>
                    <asp:Label runat="server" ID="lblTotal"></asp:Label>

                </ItemTemplate>
            </asp:TemplateField>
        </Columns> 
</asp:GridView>

Затем добавьте следующий Javascript в ваш тег Head:

<script type="text/javascript">
    function GetTotal(obj) {
        var rowIndex = obj.id.substring(obj.id.lastIndexOf('_') + 1, obj.id.length);
        var unitCost = document.getElementById('MainContent_gv1_unitCost_' + rowIndex).innerHTML.replace("$", "") ;
        var originalCount = document.getElementById('MainContent_gv1_originalCount_' + rowIndex).innerHTML;
        var NewCount = document.getElementById('MainContent_gv1_NewCount_' + rowIndex).value;
        document.getElementById('MainContent_gv1_lblTotal_' + rowIndex).innerHTML = "$" + ((originalCount - NewCount) * unitCost).toFixed(2);    }
</script>

Вот, пожалуйста. Когда вы вносите изменения в NewCount, итоговая сумма автоматически обновляется в крайнем правом столбце.


Старый ответ

Вы можете сделать это, добавив новый TemplateField, а затем написав статический метод для вычисления итогов. Это не в моей голове, но вы делаете что-то похожее на то, что ниже.

Сначала добавьте следующий TemplateField:

<asp:TemplateField HeaderText="Total" ItemStyle-HorizontalAlign="Center" >
   <ItemTemplate>
      <%# GetTotal((double)Eval("originalCount"),(double)Eval("NewCount"),(double)Eval("unitCost")) %>
   </ItemTemplate>
</asp:TemplateField>

Затем в коде добавьте следующий статический метод:

public static double GetTotal(double originalCount, double NewCount, double unitCost) {
    return (originalCount - NewCount) * unitCost;
}

Конечным результатом будет столбец с желаемым рассчитанным итогом.

1 голос
/ 21 декабря 2015

Лучший ответ - ЕДИНАЯ ЛИНИЯ

<asp:TemplateField HeaderText="Net Amt">
    <ItemTemplate>    
<%# (Eval("itm_or_fee_amt")==DBNull.Value?0:Convert.ToDouble(Eval("itm_or_fee_amt")))+(Eval("late_fee")==DBNull.Value?0:Convert.ToDouble(Eval("late_fee"))) %>
 </ItemTemplate>  
 </asp:TemplateField>
0 голосов
/ 12 января 2016

Totalcount (cell3)

(originalCount (cell0) - NewCount (cell1)) * unitCost (cell2);

В методе с привязкой к строке

e.Row.Cells[3] .text = (e.Row.Cells [0] .text -e.Row.Cells [1] .. text) * e.Row.Cells [2] .text

...