.net Datagridview中的方形填充复选框

.net Datagridview中的方形填充复选框,.net,vb.net,winforms,datagridview,datagridviewcheckboxcell,.net,Vb.net,Winforms,Datagridview,Datagridviewcheckboxcell,我有一个像这样的数据库 表名:ri_闭包 正如您在上图中看到的,除了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 MyS

我有一个像这样的数据库

表名:ri_闭包

正如您在上图中看到的,除了
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
这就是它看起来的样子

现在你看到了输出,我相信你不会想要红色的。这是我的代码

  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
现在是我的问题,我希望这是可能的。我想做一些像这样的事情,而不是打开,并把细胞变成红色,我如何才能使未关闭的细胞像这样

而不是空复选框,它将看起来与上面的图像相同

我希望另一个生成填充复选框的复选框将替换未勾选的值,因为我在检查该复选框时有代码

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


TYSM将来的帮助

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

这是我建议你应该做的

  • 决定要显示的图像而不是复选框(例如绿色勾号)
  • DataGridView
    VirtualMode
    属性设置为
    true
  • DataGridView
    DataTable
    绑定后,迭代所有月份列,将
    DataPropertyName
    设置为空字符串(这对于触发事件很重要)
  • DataGridView
    的事件创建一个事件处理程序,在此事件中,您将在事件参数中接收列索引和行索引。使用该值查找后面的实际值,然后返回绿色勾号图像(使用
    e.value
    )或根据值返回空白图像

  • 通过处理
    DataGridView
    的事件,您可以自定义
    DataGridView复选框
    列的绘制。然后可以使用以所需状态绘制复选框。要为复选框的未选中状态显示的状态为:

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

    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
    后,要以红色绘制未选中(实际上是混合状态)的图像,请使用以下代码:

    If (state = VisualStyles.CheckBoxState.MixedNormal) Then
        Dim rect = New Rectangle(location, size)
        rect.Inflate(-2, -2)
        e.Graphics.FillRectangle(Brushes.Red, rect)
    End If
    

    先生,您能将您的代码重新合并到“我的代码”加载表单中吗?请注意,这与表单加载无关。处理网格的
    CellPainting
    事件<代码>如果(e.ColumnIndex=0意味着对索引0处的列使用自定义绘制逻辑。我尝试了您的代码,先生,第1列和第2列是唯一有权输出的行。我将更新我的帖子。先生,不要更新问题。如果有任何问题,请在此处提问。我收到了您的问题,在这种情况下,如果您编辑了问题,答案似乎没有用,问题将被删除。)斯蒂昂会让人困惑。
    If (state = VisualStyles.CheckBoxState.MixedNormal) Then
        Dim rect = New Rectangle(location, size)
        rect.Inflate(-2, -2)
        e.Graphics.FillRectangle(Brushes.Red, rect)
    End If