让DataGridView自动添加合计行
时间:2010-12-04 来源:gmtyt
Namespace OtherTools
Class DataGridViewAddSumRow
Private dgv As DataGridView = Nothing
Private dt As DataTable = Nothing
Public Sub New()
End Sub
'
''' <summary>
''' 设置表格的数据源
''' </summary>
Public WriteOnly Property dataTableName() As DataTable
Set
Me.dt = value
End Set
End Property
'
''' <summary>
'''传递表格的名称
''' </summary>
Public WriteOnly Property DgvName() As DataGridView
Set
dgv = value
End Set
End Property
'
''' <summary>
''' 开始添加合计行
''' </summary>
Public Sub begin()
initDgv()
End Sub
Private Sub initDgv()
If dgv <> Nothing Then
Me.dgv.DataSourceChanged += New EventHandler(dataGridView_DataSourceChanged)
Me.dgv.ColumnHeaderMouseClick += New DataGridViewCellMouseEventHandler(dataGridView_ColumnHeaderMouseClick)
Me.dgv.CellValueChanged += New DataGridViewCellEventHandler(dataGridView_CellValueChanged)
Me.dgv.AllowUserToAddRows = False
dgv.DataSource = dt
End If
End Sub
'
''' <summary>
''' 计算合计算
''' </summary>
''' <param name="dgv">要计算的DataGridView</param>
Private Sub SumDataGridView(dgv As DataGridView)
If dgv.DataSource = Nothing Then
Return
End If
'DataTable dt = (DataTable)dgv.DataSource;
If dt.Rows.Count < 1 Then
Return
End If
Dim tal As Decimal() = New Decimal(dt.Columns.Count) {}
Dim ndr As DataRow = dt.NewRow()
Dim talc As String = ""
Dim number As Integer = 1
For Each dr As DataRow In dt.Rows
dr("@xu.Hao") = System.Math.Max(System.Threading.Interlocked.Increment(number),number - 1)
Dim n As Integer = 0
For Each dc As DataColumn In dt.Columns
If talc = "" AndAlso dc.DataType.Name.ToUpper().IndexOf("STRING") >= 0 Then
talc = dc.ColumnName
End If
If dc.DataType.IsValueType Then
Dim hej As String = dr(dc.ColumnName).ToString()
Try
If hej <> String.Empty Then
tal(n) += Decimal.Parse(hej)
End If
Catch generatedExceptionName As Exception
'if (hej != string.Empty) tal[n] += decimal.Parse(hej);
End Try
End If
System.Math.Max(System.Threading.Interlocked.Increment(n),n - 1)
Next
Next
ndr.BeginEdit()
Dim i As Integer = 0
While i < dt.Columns.Count
If tal(i) <> 0 Then
ndr(i) = tal(i)
End If
System.Math.Max(System.Threading.Interlocked.Increment(i),i - 1)
End While
ndr("@xu.Hao") = (DirectCast((dt.Rows.Count + 1), Integer)).ToString()
If talc <> "" Then
ndr(talc) = "合计"
End If
ndr.EndEdit()
dt.Rows.Add(ndr)
dgv.Rows(dgv.Rows.Count - 1).DefaultCellStyle.BackColor = Color.FromArgb(255, 222, 210)
dgv.Rows(dgv.Rows.Count - 1).[ReadOnly] = True
If dgv.Tag = Nothing Then
For Each dgvc As DataGridViewColumn In dgv.Columns
dgvc.SortMode = DataGridViewColumnSortMode.Programmatic
Next
End If
dgv.Tag = ndr
End Sub
Private Sub dataGridView_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs)
Dim sortDgv As DataGridView = DirectCast(sender, DataGridView)
Dim fx As Integer = 0
If sortDgv.AccessibleDescription = Nothing Then
fx = 1
Else
fx = Integer.Parse(sortDgv.AccessibleDescription)
fx = (If(fx = 0, 1, 0))
End If
sortDgv.AccessibleDescription = fx.ToString()
If sortDgv.Columns(e.ColumnIndex).Name = "@xu.Hao" Then
Return
End If
Dim nCol As DataGridViewColumn = sortDgv.Columns(e.ColumnIndex)
If nCol.DataPropertyName = String.Empty Then
Return
End If
If nCol <> Nothing Then
sortDgv.Sort(nCol, If(fx = 0, ListSortDirection.Ascending, ListSortDirection.Descending))
End If
'--
Dim dr As DataRow = DirectCast(sortDgv.Tag, DataRow)
Dim dt As DataTable = DirectCast(sortDgv.DataSource, DataTable)
Dim ndr As DataRow = dt.NewRow()
ndr.BeginEdit()
Dim i As Integer = 0
While i < dt.Columns.Count
ndr(i) = dr(i)
System.Math.Max(System.Threading.Interlocked.Increment(i),i - 1)
End While
dt.Rows.Remove(dr)
'if (e.ColumnIndex != 0)
If True Then
Dim n As Integer = 1
Dim i As Integer = 0
While i < sortDgv.Rows.Count
Dim dgRow As DataGridViewRow = sortDgv.Rows(i)
Dim drv As DataRowView = DirectCast(dgRow.DataBoundItem, DataRowView)
Dim tdr As DataRow = drv.Row
tdr.BeginEdit()
tdr("@xu.Hao") = n
System.Math.Max(System.Threading.Interlocked.Increment(n),n - 1)
tdr.EndEdit()
System.Math.Max(System.Threading.Interlocked.Increment(i),i - 1)
End While
sortDgv.Refresh()
sortDgv.RefreshEdit()
End If
ndr("@xu.Hao") = (DirectCast((dt.Rows.Count + 1), Integer)).ToString()
ndr.EndEdit()
dt.Rows.Add(ndr)
sortDgv.Tag = ndr
'--
sortDgv.Sort(sortDgv.Columns("@xu.Hao"), ListSortDirection.Ascending)
sortDgv.Columns("@xu.Hao").HeaderCell.SortGlyphDirection = SortOrder.None
nCol.HeaderCell.SortGlyphDirection = If(fx = 0, SortOrder.Ascending, SortOrder.Descending)
sortDgv.Rows(sortDgv.Rows.Count - 1).DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 210)
End Sub
Private Sub dataGridView_DataSourceChanged(sender As Object, e As EventArgs)
Dim dgv As DataGridView = DirectCast(sender, DataGridView)
'DataTable dt = (DataTable)dgv.DataSource;
If dt = Nothing Then
Return
End If
Dim tal As Decimal() = New Decimal(dt.Columns.Count) {}
If dt.Columns.IndexOf("@xu.Hao") < 0 Then
Dim dc As New DataColumn("@xu.Hao", System.Type.[GetType]("System.Int32"))
dt.Columns.Add(dc)
dgv.Columns("@xu.Hao").DisplayIndex = 0
dgv.Columns("@xu.Hao").HeaderText = "序号"
dgv.Columns("@xu.Hao").SortMode = DataGridViewColumnSortMode.Programmatic
dgv.AutoResizeColumn(dgv.Columns("@xu.Hao").Index)
dgv.Columns("@xu.Hao").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
dgv.Columns("@xu.Hao").Visible = True
End If
SumDataGridView(dgv)
End Sub
Private Sub dataGridView_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs)
Dim dgv As DataGridView = DirectCast(sender, DataGridView)
If dgv.Tag = Nothing OrElse e.RowIndex < 0 OrElse e.RowIndex = dgv.Rows.Count - 1 Then
Return
End If
Dim col As String = dgv.Columns(e.ColumnIndex).DataPropertyName
If col = String.Empty Then
Return
End If
If (DirectCast(dgv.Rows(e.RowIndex).DataBoundItem, DataRowView)).Row.Table.Columns(col).DataType.IsValueType Then
Dim tal As Decimal = 0
For Each dgvr As DataGridViewRow In dgv.Rows
If dgvr.Index <> dgv.Rows.Count - 1 Then
Dim hej As String = dgvr.Cells(e.ColumnIndex).Value.ToString()
If hej <> String.Empty Then
tal += Decimal.Parse(hej)
End If
End If
Next
If tal = 0 Then
dgv(e.ColumnIndex, dgv.Rows.Count - 1).Value = DBNull.Value
Else
dgv(e.ColumnIndex, dgv.Rows.Count - 1).Value = tal
End If
End If
End Sub
End Class
End Namespace