如何通过 cellmouse/click 触发在 DataGridView 顶部绘制矩形?

问题描述

如何在 DataGridView 中通过完全不同的单元触发瞬时在某个特定单元格顶部绘制矩形 [destination: col2,row4] [trigger: col1,row3] 被点击了吗?

显然,我选择了两个随机单元格位置,并试图将我的问题简化为基本块。显然,他们不能被强迫一起工作。由于缺乏通用签名,我对事件处理程序的理解不够深入,无法在另一个事件中调用一个事件。我认为挫折使我的视野和看到任何合乎逻辑的可能性的能力蒙上了阴影。

Private Sub DataGridView1_Paint(sender As Object,e As PaintEventArgs) Handles DataGridView1.Paint  
    Using ColBlue As New SolidBrush(Color.Blue)
        e.Graphics.FillRectangle(ColBlue,x,y,width,height)
        'Todo: decide loc and rect size
    End Using
End Sub

Private Sub Datagridview1_CellMouseClick(sender As Object,e As DataGridViewCellMouseEventArgs) Handles Datagridview1.CellMouseClick
    'Todo: Gain a better understanding of the event handler
End Sub

我的直觉告诉我要编写一个自定义子或函数,但我不确定它们需要什么,使用或不使用哪些 eventargs。

解决方法

感谢 Jimi 耐心指出我的解决方案所需的主要部分。

我的代码的简化版本,适用于那些发现自己丢失并且无法通过鼠标点击触发绘制矩形的人。

结果 [代码]

Private Sub Form1_Load(sender As Object,e As EventArgs) Handles Me.Load
   ‘Init new list of rectangles
   Dim bluegradeT As New List(Of Rectangle) From {}‎
   Dim ablue As New Rectangle

   ‘Programmatically adding the cells I want to paint to my list beforehand
   bluegradeT.Add(DgvTall.GetCellDisplayRectangle(5,1,False))
   bluegradeT.Add(DgvTall.GetCellDisplayRectangle(7,2,False))
   bluegradeT.Add(DgvTall.GetCellDisplayRectangle(5,5,3,False))
   bluegradeT.Add(DgvTall.GetCellDisplayRectangle(6,False))
   bluegradeT.Add(DgvTall.GetCellDisplayRectangle(4,False))
End Sub
Private Sub DataGridView1_Paint(sender As Object,e As PaintEventArgs) Handles DataGridView1.Paint
   ‘I have multiple paint events of different colors that I wanted triggered by clicking
   ‘specific cells in the dgv
   If DataGridView1.CurrentCell.ColumnIndex = 2 Then
    If DataGridView1.CurrentCell.RowIndex = 1 Then
    ‘so if the clicked location is {2,1},then paint
       Using ColBlue As New SolidBrush(Color.FromArgb(50,Color.Blue))
       ‘this particular brush paints blue at 50 opacity 
        For Each ablue As Rectangle In bluegradeT
        ‘use a loop to retrieve all the rects stored for this paint
           e.Graphics.FillRectangle(ColBlue,ablue)
        Next
       End Using
    End If
    End If
End Sub
Private Sub DataGridView1_CellMouseClick(sender As Object,e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseClick
   If DataGridView1.Rows(e.RowIndex).Selected Then
    If DataGridView1.Columns.(e.ColumnIndex).Selected Then
    ‘If some cell has been selected…
        DataGridView1.Invalidate(ablue)
        ‘trigger painting of dgv,but only in the area of tbe rectangles list
        DataGridView1.Refresh()
        ‘to make sure the control updates immediately
    End if
    End If
End Sub   

讨论

这开始是一项实验,目的是查看互联网上的哪些方法可以通过所需的工作量实现最佳色彩混合。我真的只找到了一个无尽的讨论板帖子,其中包含 C++ 理论和各种方法。我可以看到唯一的原生方法——除了我聪明的技巧——是 colorblend(). 最初,颜色混合似乎不可能比我的概念更复杂,但实际上,它可能比我想象的要容易。 [我确定其他人在我之前做过这个,但我不在乎,今天这是我的技术]总的来说,它通过在已经绘制的顶部重叠半透明颜色矩形来组合看起来很自然的颜色方面做得非常出色动态 DGV 细胞。这无疑比在 Photoshop 中手动混合颜色更快...

...

...

...

...

关于在社交媒体成瘾时代保持积极心理健康的建议

我知道这里不适合这样做,但作为一名进行过这项研究的大学心理学学生,我只是想分享一下,我们的生活归功于健康的睡眠模式,总共持续 8 小时。睡眠对我们的整体健康和记忆力比任何饮食或药物都更重要。 10 次中有 99 次,当我愚蠢地无法直接看到正确答案时——就像我在这个论坛上所做的那样)——通常,只能怪一个替罪羊:我男人的眼睛强>。 然而,这个项目提醒我,不停地、不断地追求解决方案会导致上述答案继续躲避,直到做出放弃的决定。人们开玩笑说,熬夜或得到“只有 4 小时兄弟”是男子气概的“成就”,或者睡眠不足是可以弥补的。错误的。在 20 小时的睡眠剥夺后,我们的大脑会变得像喝醉酒的人一样受损。每周只让自己睡四五个小时,患癌症、糖尿病、肥胖症和痴呆症的几率就会增加 70%。*

祝大家编程愉快!