将复选框添加到datagridview列标题,而不是正确对齐

时间:2013-03-20 21:47:08

标签: vb.net winforms checkbox datagridview

我试图在特定的datagridview列标题中添加一个复选框,我在网上发现了一些代码来帮助但它没有正确对齐,我真的不确定如何修复它。

下面是问题和代码的图片,非常感谢任何帮助!

P.S。我认为这可能与房产有关,但我玩过它们却没有成功。

enter image description here

Private checkboxHeader231 As CheckBox
Private Sub show_chkBox()
Dim rect As Rectangle = DataGridView1.GetCellDisplayRectangle(columnIndexOfCheckBox, -1, True)
' set checkbox header to center of header cell. +1 pixel to position 
rect.Y = 3
rect.X = rect.Location.X + 8 + (rect.Width / 4)
checkboxHeader231 = New CheckBox()
With checkboxHeader231
    .BackColor = Color.Transparent
End With

checkboxHeader231.Name = "checkboxHeader1"
checkboxHeader231.Size = New Size(18, 18)
checkboxHeader231.Location = rect.Location
AddHandler checkboxHeader231.CheckedChanged, AddressOf checkboxHeader231_CheckedChanged
DataGridView1.Controls.Add(checkboxHeader231)
End Sub

Private Sub checkboxHeader231_CheckedChanged(sender As System.Object, e As System.EventArgs)
Dim headerBox As CheckBox = DirectCast(DataGridView1.Controls.Find("checkboxHeader1", True)(0), CheckBox)
For Each row As DataGridViewRow In DataGridView1.Rows
    row.Cells(columnIndexOfCheckBox).Value = headerBox.Checked
Next
End Sub

2 个答案:

答案 0 :(得分:2)

这是我的第一篇文章,但我认为这正是你要找的。我测试了它,它在我的数据网格上工作。你使用的是矩形的宽度,你需要它来代替列宽。我将列标题设置为4,但是你要用你要使用的列替换4我用两种方式把它放在一起,一个用四个循环,另一个用作单行。告诉我这是否适合你:

Dim rect As Rectangle = DataGridView1.GetCellDisplayRectangle(4, -1, True) ' replace 4
        rect.Y = 3

        Dim sum = DataGridView1.Columns(0).Width

        'for this area write a for loop to find the width of each column except for the last line which you manually do
        '
        '
        'For i As Integer = 1 To 4 - 1 Step 1  ' replace 4
        'sum = sum + DataGridView1.Columns(i).Width
        'Next

        sum = sum + DataGridView1.Columns(1).Width
        sum = sum + DataGridView1.Columns(2).Width
        sum = sum + DataGridView1.Columns(3).Width
        ' stop here and add the last line by hand here

        sum = sum + (DataGridView1.Columns(4).Width / 2) + 35 ' used in both cases ' replace 4
        rect.X = sum

        checkboxHeader231 = New CheckBox()
        With checkboxHeader231
            .BackColor = Color.Transparent
        End With

        checkboxHeader231.Name = "checkboxHeader1"
        checkboxHeader231.Size = New Size(18, 18)
        checkboxHeader231.Location = rect.Location
        AddHandler checkboxHeader231.CheckedChanged, AddressOf checkboxHeader231_CheckedChanged
        DataGridView1.Controls.Add(checkboxHeader231)

答案 1 :(得分:0)

Private headerBox As CheckBox
Private Sub show_checkBox()
        Dim checkboxHeader As CheckBox = New CheckBox()
        Dim rect As Rectangle = PendingApprovalServiceListingDataGridView.GetCellDisplayRectangle(4, -1, True)
        rect.X = 20
        rect.Y = 12
        With checkboxHeader
            .BackColor = Color.Transparent
        End With
        checkboxHeader.Name = "checkboxHeader"
        checkboxHeader.Size = New Size(14, 14)
        checkboxHeader.Location = rect.Location
        AddHandler checkboxHeader.CheckedChanged, AddressOf checkboxHeader_CheckedChanged
        PendingApprovalServiceListingDataGridView.Controls.Add(checkboxHeader)
    End Sub
    Private Sub checkboxHeader_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        headerBox = DirectCast(PendingApprovalServiceListingDataGridView.Controls.Find("checkboxHeader", True)(0), CheckBox)
        For Each row As DataGridViewRow In PendingApprovalServiceListingDataGridView.Rows
            row.Cells(0).Value = headerBox.Checked
        Next
    End Sub