Hi
I want to create sales invoice in radgridview. when user start entry in item name which is combobox in radgridview which data (item name and qty) will come from item master user enter qty total should be calculated automatically at the same time grand total should shown radgridview footer.
when user press save button all entries in radgridview should save database. I need after which event footer will be updated. or if i remove radgridview row radgridview footer should be updated.
Regards
Nandan Navale
1 Answer, 1 is accepted
RadGridView offers calculated columns identified by an expression. Thus, you can specify how the value to be calculated by this column. More information is available here:
https://docs.telerik.com/devtools/winforms/controls/gridview/columns/calculated-columns-(column-expressions)
You can use summary rows to show summary information about the displayed data, such as first item, last item, count, total sum, etc. The summary rows can be top and bottom pinned:
https://docs.telerik.com/devtools/winforms/controls/gridview/rows/summary-rows
As to the question about saving the changes to the database, you can use the following approach:
https://docs.telerik.com/devtools/winforms/controls/gridview/populating-with-data/updating-the-database-with-ado.net
I hope this information helps. If you need any further assistance please don't hesitate to contact me.
Regards,
Dess | Tech Support Engineer, Principal
Progress Telerik
Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.
Hi Dess
Thanks for your reply. I want to ask like asp.net gridview can we add command button at end of radgridview to delete particular row. I am able to calculate column like qty * rate total. This is for horizontal i want to display total gross total to footer so which event i have to use so footer gross total will be change accordingly row inserted or deleted
Thanks & Regards
Nandan Navale
Hi, Nandan,
RadGridView offers command columns as well. More information how to use it is available in the following article:
As to the "footer" with calculations, note that the summary rows automatically recalculate the value when a row is deleted or added.
Hi Dess
Thank you for your Help..
From given tutorials from you i have idea how to do it. But one question is pending that how to get grand total on summary row. I mean after which event summary row will be updated. Kindly check screen shot so you will understand.
i put qty and rate total automatically get calculated but summary rows is not updated.
regards
Nandan Navale
Hi, Nandan,
The summary rows update automatically their value whenever a new row is added, an existing one is updated or deleted. I have prepared a sample code snippet for your reference:
GridViewDecimalColumn qty = new GridViewDecimalColumn("Qty");
this.radGridView1.Columns.Add(qty);
GridViewDecimalColumn rate = new GridViewDecimalColumn("Rate");
this.radGridView1.Columns.Add(rate);
GridViewDecimalColumn col = new GridViewDecimalColumn("Total");
radGridView1.Columns.Add(col);
radGridView1.Columns["Total"].Expression = "Qty * Rate";
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.Rows.Add(10, 20);
GridViewSummaryItem summaryItem = new GridViewSummaryItem();
summaryItem.Name = "Total";
summaryItem.Aggregate = GridAggregateFunction.Sum;
GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem();
summaryRowItem.Add(summaryItem);
this.radGridView1.SummaryRowsBottom.Add(summaryRowItem);
Please refer to the below achieved result:
Hi Dess
Thanks for reply. With your help i have written code in radgridview. Kindly check its working.
Public Class frmtest
Dim dbManager As New SqlHelper(ConfigurationManager.ConnectionStrings("ConString").ToString())
Private Sub frmtest_Load(sender As Object, e As EventArgs) Handles Me.Load
SetupGridViewForTransaction()
End Sub
Private Sub SetupGridViewForTransaction()
ObjGrdView.AutoGenerateColumns = False
ObjGrdView.Columns.Clear()
Dim ColtSrNo As New GridViewTextBoxColumn()
ColtSrNo.Name = "ColtSrNo"
ColtSrNo.HeaderText = "Sr.No"
ColtSrNo.TextAlignment = ContentAlignment.BottomRight
ColtSrNo.Width = 25
ObjGrdView.MasterTemplate.Columns.Add(ColtSrNo)
Dim ColItemName As GridViewComboBoxColumn = New GridViewComboBoxColumn("ColItemName")
ColItemName.HeaderText = "Item"
ColItemName.DataSource = FetchAllRecords()
ColItemName.FieldName = "ItemName"
ColItemName.ValueMember = "ItemId"
ColItemName.DisplayMember = "ItemName"
ColItemName.Width = 100
Me.ObjGrdView.Columns.Add(ColItemName)
Dim ColQty As GridViewDecimalColumn = New GridViewDecimalColumn("ColQty")
ColQty.HeaderText = "Qty"
ColQty.DecimalPlaces = 3
Me.ObjGrdView.Columns.Add(ColQty)
Dim ColRate As GridViewDecimalColumn = New GridViewDecimalColumn("ColRate")
ColRate.HeaderText = "Rate"
ColRate.DecimalPlaces = 3
Me.ObjGrdView.Columns.Add(ColRate)
Dim ColTotal As GridViewDecimalColumn = New GridViewDecimalColumn("ColTotal")
ColTotal.HeaderText = "Total"
ColTotal.DecimalPlaces = 3
ColTotal.FormatString = "{0:N2}"
Me.ObjGrdView.Columns.Add(ColTotal)
ObjGrdView.Columns("ColTotal").Expression = "ColQty * ColRate"
Me.ObjGrdView.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill
Dim colFooterTotal As GridViewSummaryItem = New GridViewSummaryItem("ColRate", "Total", GridAggregateFunction.Count)
Dim summaryItem As GridViewSummaryItem = New GridViewSummaryItem()
summaryItem.Name = "ColTotal"
summaryItem.Aggregate = GridAggregateFunction.Sum
Dim summaryRowItem As GridViewSummaryRowItem = New GridViewSummaryRowItem(New GridViewSummaryItem() {})
summaryRowItem.Add(summaryItem)
Dim totalRow As GridViewSummaryRowItem = New GridViewSummaryRowItem(New GridViewSummaryItem() {colFooterTotal, summaryItem})
Me.ObjGrdView.SummaryRowsBottom.Add(totalRow)
AddHandler ObjGrdView.CommandCellClick, AddressOf ObjGrdView_CommandCellClick
End Sub
Private Function FetchAllRecords() As DataTable
Dim dtData As DataTable = New DataTable()
Try
Dim parameters = New List(Of SqlParameter)()
parameters.Clear()
With parameters
.Add(dbManager.CreateParameter("@ActionType", "FillOnlyItemName", DbType.String))
End With
dtData = dbManager.GetDataTable("SP_ItemMaster_Select", CommandType.StoredProcedure, parameters.ToArray())
Catch ex As Exception
MessageBox.Show("Error:- " & ex.Message)
End Try
Return dtData
End Function
Private Sub ObjGrdView_CellFormatting(sender As Object, e As CellFormattingEventArgs) Handles ObjGrdView.CellFormatting
If e.CellElement.ColumnInfo.Name = "ColtSrNo" Then
e.CellElement.Text = (e.CellElement.RowIndex + 1).ToString()
End If
End Sub
Private Sub ObjGrdView_RowValidating(sender As Object, e As RowValidatingEventArgs) Handles ObjGrdView.RowValidating
e.Row.ErrorText = String.Empty
If TypeOf e.Row Is GridViewDataRowInfo Then
If e.Row.Cells(4).Value Is Nothing OrElse String.IsNullOrEmpty(e.Row.Cells(4).Value.ToString()) Then
e.Row.ErrorText = "Empty value is not allowed"
e.Cancel = True
End If
End If
End Sub
Private Sub ObjGrdView_CommandCellClick(sender As Object, e As GridViewCellEventArgs) Handles ObjGrdView.CommandCellClick
Me.ObjGrdView.Rows.RemoveAt(0)
End Sub
Private Sub ObjGrdView_CellValidating(sender As Object, e As CellValidatingEventArgs) Handles ObjGrdView.CellValidating
'Dim column As GridViewDataColumn = TryCast(e.Column, GridViewDataColumn)
'If TypeOf e.Row Is GridViewDataRowInfo AndAlso column IsNot Nothing AndAlso column.Name = "ColQty" Then
' If String.IsNullOrEmpty(DirectCast(e.Value, String)) OrElse DirectCast(e.Value, String).Trim() = String.Empty Then
' e.Cancel = True
' DirectCast(e.Row, GridViewDataRowInfo).ErrorText = "Validation error!"
' Else
' DirectCast(e.Row, GridViewDataRowInfo).ErrorText = String.Empty
' End If
'End If
End Sub
Private Sub ObjGrdView_ViewCellFormatting(sender As Object, e As CellFormattingEventArgs) Handles ObjGrdView.ViewCellFormatting
If TypeOf e.Row Is GridViewSummaryRowInfo Then
If e.Column.Name = "ColRate" Then
e.CellElement.TextAlignment = ContentAlignment.MiddleCenter
Else
e.CellElement.TextAlignment = ContentAlignment.MiddleRight
End If
End If
If TypeOf e.CellElement Is GridSummaryCellElement Then
Dim summaryFont As Font = New Font("Tahoma", 9, FontStyle.Bold)
e.CellElement.Font = summaryFont
End If
End Sub
End Class
need suggestion if any
Question is closed. thanks again
Regards
Nandan Navale
Hi dess
I have write code to fill radgrdiview. When user select number for dropdownlist then radgridview will be populated using datatable. it works correctly but grand total is not coming at summaryrow level.
kindly go through my code
Private Sub SetupGridView()
ObjGrdView.AutoGenerateColumns = False
ObjGrdView.EnableFiltering = False
ObjGrdView.MasterTemplate.ShowHeaderCellButtons = True
ObjGrdView.MasterTemplate.ShowFilteringRow = False
ObjGrdView.CurrentRow = Nothing
ObjGrdView.Columns.Clear()
Dim ColtSrNo As GridViewTextBoxColumn = New GridViewTextBoxColumn("ColtSrNo")
ColtSrNo.HeaderText = "Sr.No"
ColtSrNo.TextAlignment = ContentAlignment.BottomRight
ColtSrNo.Width = 25
ObjGrdView.MasterTemplate.Columns.Add(ColtSrNo)
Dim ColItemType As GridViewTextBoxColumn = New GridViewTextBoxColumn("ColItemType")
ColItemType.HeaderText = "Item Type"
ColItemType.FieldName = "ItemType"
ColItemType.TextAlignment = ContentAlignment.MiddleLeft
ColItemType.Width = 25
Me.ObjGrdView.Columns.Add(ColItemType)
Dim ColLotNo As GridViewTextBoxColumn = New GridViewTextBoxColumn("ColLotNo")
ColLotNo.HeaderText = "Slip/Bag No"
ColLotNo.FieldName = "SlipBagNo"
Me.ObjGrdView.Columns.Add(ColLotNo)
Dim ColItemName As GridViewTextBoxColumn = New GridViewTextBoxColumn("ColItemName")
ColItemName.HeaderText = "ItemName"
ColItemName.FieldName = "ItemName"
Me.ObjGrdView.Columns.Add(ColItemName)
Dim ColGrossWt As GridViewDecimalColumn = New GridViewDecimalColumn("ColGrossWt")
ColGrossWt.HeaderText = "Gross Wt."
ColGrossWt.FieldName = "GrossWt"
ColGrossWt.DecimalPlaces = 2
Me.ObjGrdView.Columns.Add(ColGrossWt)
Dim ColGrossPr As GridViewDecimalColumn = New GridViewDecimalColumn("ColGrossPr")
ColGrossPr.HeaderText = "Gross %"
ColGrossPr.FieldName = "GrossPr"
ColGrossPr.DecimalPlaces = 2
ColGrossPr.FormatString = "{0:N2}"
Me.ObjGrdView.Columns.Add(ColGrossPr)
Dim ColFineWt As GridViewDecimalColumn = New GridViewDecimalColumn("ColFineTotal")
ColFineWt.HeaderText = "Fine Total"
ColFineWt.FieldName = "FineWt"
ColFineWt.DecimalPlaces = 3
ColFineWt.FormatString = "{0:N2}"
Me.ObjGrdView.Columns.Add(ColFineWt)
Dim totalNameItem As GridViewSummaryItem = New GridViewSummaryItem("ColItemName", "Total", GridAggregateFunction.Count)
Dim totalItemGWt As GridViewSummaryItem = New GridViewSummaryItem("ColGrossWt", "{0}", GridAggregateFunction.Sum)
Dim totalItemGFt As GridViewSummaryItem = New GridViewSummaryItem("ColFineWt", "{0}", GridAggregateFunction.Sum)
Dim totalItemGPr As GridViewSummaryItem = New GridViewSummaryItem("ColGrossPr", "{0: 0.00}", GridAggregateFunction.None)
totalItemGPr.AggregateExpression = "(Sum(colFineWt) / Sum(ColGrossWt) * 100)"
Dim totalRow As GridViewSummaryRowItem = New GridViewSummaryRowItem(New GridViewSummaryItem() {totalNameItem, totalItemGWt, totalItemGFt, totalItemGPr})
Me.ObjGrdView.SummaryRowsBottom.Add(totalRow)
End Sub
Private Sub cmbLotNo_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbLotNo.SelectedIndexChanged
Dim dtData As DataTable = New DataTable()
If cmbLotNo.SelectedIndex > 0 Then
Dim parameters = New List(Of SqlParameter)()
parameters.Clear()
With parameters
.Add(dbManager.CreateParameter("@ActionType", "FetchMeltingReport", DbType.String))
.Add(dbManager.CreateParameter("@MId", cmbLotNo.SelectedValue, DbType.Int16))
End With
dtData = dbManager.GetDataTable("SP_Melting_Select", CommandType.StoredProcedure, parameters.ToArray())
If dtData.Rows.Count > 0 Then
Me.SetupGridView()
ObjGrdView.DataSource = dtData
Else
End If
End If
End Sub
Regards
Nandan Navale
Hi Nandan,
If I correctly understand your current setup, you would need to update the summary row. You can achieve this by invalidating it this way:
this.radGridView1.MasterView.SummaryRows[0].InvalidateRow();
Please note that I am not able to directly test your code as it depends on your database. If you would like us to look into your exact scenario, you can open up a support ticket and send us a runnable sample project so that we can investigate it in details.
Regards,
Hristo
Hi Hristo
Thanks for your reply, Unfortunately your solutions does not work or I dont know how to use this. In this form if i change index of tabcontrol summary row increase row by row. You can see in screen shot.
Private Sub dgvNTLSampleReport_CellValueChanged(sender As Object, e As GridViewCellEventArgs) Handles dgvNTLSampleReport.CellValueChanged
If e.Column.Name = "colSampleWt" Then
Me.dgvNTLSampleReport.MasterView.SummaryRows(0).InvalidateRow()
End If
End Sub
Regards
Nandan Navale
Without replicating the issue locally, it wouldn't be easy to determine what causes this undesired behavior on your end. That is why I would highly encourage you to submit a support ticket from your Telerik account and provide a sample runnable project demonstrating the problem you are facing. Thus, we would be able to make an adequate analysis of the precise case and provide further assistance. The following tutorial gives some useful tips and tricks when submitting support tickets:
https://docs.telerik.com/devtools/winforms/knowledge-base/submit-support-tickets
I hope this information helps.