文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>让DataGridView自动添加合计行

让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

相关阅读 更多 +
排行榜 更多 +
枪炮战场真实模拟手游 v2024.11.167 安卓版

枪炮战场真实模拟手游 v2024.11.167 安卓版

飞行射击 下载
枪炮战场真实模拟手游 v2024.11.167 安卓版

枪炮战场真实模拟手游 v2024.11.167 安卓版

飞行射击 下载
枪炮战场真实模拟手游 v2024.11.167 安卓版

枪炮战场真实模拟手游 v2024.11.167 安卓版

飞行射击 下载