Datagridview中的方形填充复选框

时间:2016-09-17 10:02:26

标签: .net vb.net winforms datagridview datagridviewcheckboxcell

我有一个看起来像这样的数据库

表名:ri_closure enter image description here

正如您在Month以外的所有列上方的图片上显示的内容TinyInt(1)Month Varchar现在我有代码

 Dim con1 As MySqlConnection = New MySqlConnection("server=192.168.2.87;userid=root;password=admin1950;database=inventory")
        Dim sql1 As MySqlCommand = New MySqlCommand("Select * from ri_closure", con1)
        Dim ds1 As DataSet = New DataSet
        Dim adapter1 As MySqlDataAdapter = New MySqlDataAdapter
        con1.Open()
        adapter1.SelectCommand = sql1
        adapter1.Fill(ds1, "MyTable")
        DataGridView2.DataSource = ds1.Tables(0)
        con1.Close()
        ds1.Tables(0).Columns(2).DataType = GetType(Boolean)
        Me.DataGridView2.Columns(1).Frozen = True
        Dim i As Integer
        For i = 0 To DataGridView2.Columns.Count - 1
            DataGridView2.Columns.Item(i).SortMode = DataGridViewColumnSortMode.Programmatic
        Next
        DataGridView2.Columns(0).Visible = False
        DataGridView2.Columns(1).DefaultCellStyle.BackColor = Color.LightBlue

现在这就是它的样子

enter image description here

现在你看到了输出,我确定你不想那些红色的。刺激眼睛,这是我的代码

  For Each rw As DataGridViewRow In DataGridView2.Rows
            For ii As Integer = 2 To rw.Cells.Count - 1
                If rw.Cells(ii).Value = False Then
                    rw.Cells(ii).Style.BackColor = Color.Red
                ElseIf rw.Cells(ii).Value = True Then
                    rw.Cells(ii).Style.BackColor = Color.White
                End If
            Next
        Next

现在这是我的问题,我希望有可能。我想做这样的事情而不是解开并将单元格变成红色我怎么能像这样制作未被攻击的单元格。

enter image description here

而不是空复选框,它看起来与上图相同。

另一个我希望那将生成填充复选框将替换uncheked值,因为我有代码检查那个。

我尝试了一些代码,这是输出

enter image description here

TYSM未来的帮助

2 个答案:

答案 0 :(得分:1)

您可以通过处理DataGridViewCheckBox DataGridView事件来自定义Private Sub CellPainting(ByVal sender As Object, _ ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting If (e.ColumnIndex = 0 AndAlso e.RowIndex >= 0) Then Dim value = DirectCast(e.FormattedValue, Nullable(Of Boolean)) e.Paint(e.CellBounds, DataGridViewPaintParts.All And _ Not (DataGridViewPaintParts.ContentForeground)) Dim state = IIf((value.HasValue And value.Value), _ VisualStyles.CheckBoxState.CheckedNormal, _ VisualStyles.CheckBoxState.MixedNormal) Dim size = RadioButtonRenderer.GetGlyphSize(e.Graphics, state) Dim location = New Point((e.CellBounds.Width - size.Width) / 2, _ (e.CellBounds.Height - size.Height) / 2) location.Offset(e.CellBounds.Location) CheckBoxRenderer.DrawCheckBox(e.Graphics, location, state) e.Handled = True End If End Sub 列的绘画。然后,您可以使用CellPainting绘制所需状态的复选框。您要为未选中状态的复选框显示的状态为CheckBoxRenderer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
    Dim C1 = New DataGridViewCheckBoxColumn()
    C1.DataPropertyName = "C1"
    C1.HeaderText = "C1"
    C1.TrueValue = 1
    C1.FalseValue = 0
    Me.DataGridView1.Columns.Add(C1)
    Me.DataGridView1.Rows.Add(DirectCast(1, Object))
    Me.DataGridView1.Rows.Add(DirectCast(0, Object))
    Me.DataGridView1.AllowUserToAddRows = False
End Sub

要测试解决方案,您可以通过以下方式向网格添加列:

CheckBoxRenderer.DrawCheckBox

这将是结果:

CheckBoxState.MixedNormal

要以红色绘制未选中(实际上是混合状态),请在调用If (state = VisualStyles.CheckBoxState.MixedNormal) Then Dim rect = New Rectangle(location, size) rect.Inflate(-2, -2) e.Graphics.FillRectangle(Brushes.Red, rect) End If 后使用此代码:

CoreData

enter image description here

答案 1 :(得分:0)

您可以使用DataGridView' VirtualMode,然后使用CellValueNeeded事件来显示您自己的内容。

我建议你这样做,

  1. 决定要显示的图像而不是复选框(例如绿色勾选)
  2. DataGridView' VirtualMode属性设为true
  3. DataGridView与您的DataTable迭代绑定到所有月份列后,将DataProperptyName设置为空字符串(这对于触发事件非常重要)
  4. DataGridView的{​​{3}}事件创建事件处理程序,在这种情况下,您将在事件参数中接收列索引和行索引。使用它来查找背后的实际值,然后返回绿色刻度图像(使用e.Value)或根据值返回空白图像。