'===============================================VisualMonsters.cba.pl========================================================= Public Class Form1 Private Sub DataGridView1_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs) Handles DataGridView1.RowPostPaint 'pobiera numer wiersza (numerowany od 0) Dim NumerWiersza As String = (e.RowIndex + 1).ToString 'liczy długość naszej numeracji, zapisanej wedłóg określonego Fontu Dim DlugoscWpisaneNumeracji As SizeF = e.Graphics.MeasureString(NumerWiersza, Me.Font) 'Jeśli DlugoscWpisaneNumeracji jest dłuższa od naszego nagłówka wierszy wtedy zostanie on powiększony If DataGridView1.RowHeadersWidth < CInt((DlugoscWpisaneNumeracji.Width + 20)) Then DataGridView1.RowHeadersWidth = CInt((DlugoscWpisaneNumeracji.Width + 20)) End If Dim b As Brush = SystemBrushes.ControlText 'dodaje grafikę numeracji e.Graphics.DrawString(NumerWiersza, Me.Font, b, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + ((e.RowBounds.Height - DlugoscWpisaneNumeracji.Height) / 2)) End Sub Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting 'dodajemy dynamiczną zmiane położenia naszego checkboxa If DataGridView1.RowHeadersWidth < 18 Then CheckBoxNaglowkowWierszy.Visible = False Else CheckBoxNaglowkowWierszy.Visible = True CheckBoxNaglowkowWierszy.Location = New Point((DataGridView1.RowHeadersWidth - 18) / 2, 3) End If 'wychwytuje zmniejszony element po lewej stronie Dim pierwszyElement As Boolean = True 'pętla ustawiająca lokalizację checkboxów For i As Integer = 0 To listaCheckBoxow.Count - 1 'nasz nagłówek Dim rect As Rectangle = DataGridView1.GetCellDisplayRectangle(DataGridView1.Columns(i).Index, -1, True) 'lokalizacja checkboxa Dim Pt As New Point Pt.Y = 3 'ustawienie z góry 'pętla sprawdza czy nagłówki są widoczne w całości (zmniejszone o wielkość checkboxu) If rect.Width >= DataGridView1.Columns(i).Width - 20 Then If rect.Location.X > 20 Then listaCheckBoxow(i).Visible = True If pierwszyElement = True Then Pt.X = rect.Location.X + rect.Width - 20 Else Pt.X = rect.Location.X + DataGridView1.Columns(i).Width - 20 End If pierwszyElement = False Else listaCheckBoxow(i).Visible = False End If Else If rect.Location.X > 20 Then If pierwszyElement = True Then If rect.Location.X > 0 Then 'określa czy pierwszy nagłówek jest większy od wielkości Checkboxa '(czy się zmieści) If rect.Width > 20 Then listaCheckBoxow(i).Visible = True Pt.X = rect.Location.X + rect.Width - 20 pierwszyElement = False Else listaCheckBoxow(i).Visible = False End If End If Else listaCheckBoxow(i).Visible = False End If Else listaCheckBoxow(i).Visible = False End If End If 'ustawia lokalizację obiektów listaCheckBoxow(i).Location = Pt Next End Sub Dim CheckBoxNaglowkowWierszy As New CheckBox ' lista wszyskich checkboxach w nagłówkach kolumn Public listaCheckBoxow As New List(Of CheckBox) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load DodajwierszeDoTabeli() 'Inicjujemy nasz Checkbox CheckBoxNaglowkowWierszy.Name = "CheckBoxNaglowkowWierszy" CheckBoxNaglowkowWierszy.Size = New Size(18, 18) CheckBoxNaglowkowWierszy.Checked = False CheckBoxNaglowkowWierszy.CheckAlign = ContentAlignment.MiddleCenter CheckBoxNaglowkowWierszy.BackColor = Color.White CheckBoxNaglowkowWierszy.Location = New Point((DataGridView1.RowHeadersWidth - 18) / 2, 3) 'dodajemy kontrole checkboxu do DataGridView1 DataGridView1.Controls.Add(CheckBoxNaglowkowWierszy) 'Dodajemy mu adres obsługiwanego zdarzenia AddHandler CheckBoxNaglowkowWierszy.CheckedChanged, AddressOf CheckBoxNaglowkowWierszy_zaznaczWszystkieWiersze For i As Integer = 0 To DataGridView1.ColumnCount - 1 'dla każdego nagłówka kolumny 'jeśli nagłówek będzie niewidoczny wtedy rect.x będzie <0 'a rect.Width=0 Dim rect As Rectangle = DataGridView1.GetCellDisplayRectangle(DataGridView1.Columns(i).Index, -1, True) rect.Y = 3 rect.X = rect.Location.X + rect.Width - 20 'tworzymy nowy checkbox i nadajemu mu parametry startowe Dim NaglowekKolumny = New CheckBox() NaglowekKolumny.BackColor = Color.White NaglowekKolumny.Name = DataGridView1.Columns(i).Name.ToString NaglowekKolumny.CheckAlign = ContentAlignment.MiddleCenter NaglowekKolumny.Size = New Size(18, 18) NaglowekKolumny.Checked = False 'jeśli nie dodamy tej pętli, check boxy pojawią się w dziwnych miejscach 'wyświetlimy checkboxy tylko dla widocznych kolumn If rect.Width = DataGridView1.Columns(i).Width Then NaglowekKolumny.Location = rect.Location Else NaglowekKolumny.Visible = False End If 'dodajemy wszystkie checkboxy do datagridview 'będziemy zmieniać tylko ich położenie i opcje Visible DataGridView1.Controls.Add(NaglowekKolumny) 'dodajemy mu jeszcze jakąś fonkcjonalność, aby nie było, że nic nie robią AddHandler NaglowekKolumny.CheckedChanged, AddressOf CheckBoxCheckChange listaCheckBoxow.Add(NaglowekKolumny) Next End Sub 'Dodaje elementy do naszego Datagridview Private Sub DodajwierszeDoTabeli() For i As Integer = 0 To 5 DataGridView1.Rows.Add() For j As Integer = 0 To DataGridView1.ColumnCount - 1 DataGridView1.Rows(i).Cells(j).Value = i.ToString + "_" + j.ToString Next Next End Sub 'Funkcjonalność naszego Checkboxa Private Sub CheckBoxNaglowkowWierszy_zaznaczWszystkieWiersze() If CheckBoxNaglowkowWierszy.Checked = True Then For Each dgRow As DataGridViewRow In DataGridView1.Rows dgRow.Selected = True Next Else For Each dgRow As DataGridViewRow In DataGridView1.Rows dgRow.Selected = False Next End If End Sub 'Funkcjonalność checkboxów w nagłówkach kolumn Private Sub CheckBoxCheckChange() For i As Integer = 0 To listaCheckBoxow.Count - 1 If listaCheckBoxow(i).Checked = True Then For j As Integer = 0 To DataGridView1.ColumnCount - 1 If DataGridView1.Columns(j).Name = listaCheckBoxow(i).Name Then For k As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(k).Cells(DataGridView1.Columns(j).Index).Selected = True Next End If Next Else For j As Integer = 0 To DataGridView1.ColumnCount - 1 If DataGridView1.Columns(j).Name = listaCheckBoxow(i).Name Then For k As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(k).Cells(DataGridView1.Columns(j).Index).Selected = False Next End If Next End If Next End Sub End Class