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