我有一个DataGridView
,每行都有一个与Button
相关的编辑。
在CellContentClick
事件中,我在textbox
Label
和TableLayoutPanel
个控件的数量
这种动态删除和控制创建需要花费一些时间也会闪烁(这不是一个很大的问题)。
但问题是,如果有人在一段时间后不断点击各行的编辑buttons
整个TableLayoutPanel
完全混乱。
根据我的意见,这种情况正在发生,因为我的CellContentClick
事件没有完成时间,在事件完成之前,请点击其他行的编辑button
。
我无法处理这种情况
处理程序代码在这里:
Private Sub gdXMLDOc1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles gdXMLDOc1.CellContentClick
Try
If lockThis = False Then
lockThis = True
If e.ColumnIndex = 0 Then
intPreviousRowIndex = intSelectedRowIndex
intSelectedRowIndex = e.RowIndex
gdXMLDOc1.Rows(intSelectedRowIndex).DefaultCellStyle.BackColor = Color.LightSkyBlue
If intPreviousRowIndex <> -1 And intPreviousRowIndex <> intSelectedRowIndex Then
arrQuestion(intPreviousRowIndex).questionText = Replace(txtQText_New.Text, """", "\""")
arrQuestion(intPreviousRowIndex).choice = Replace(txtOpt1_New.Text, """", "\""")
For i As Integer = 0 To arrQuestion(intPreviousRowIndex).cText_eng.Length - 1
arrQuestion(intPreviousRowIndex).cText(i).line = Replace(TableLayoutPanel1.GetControlFromPosition(2, i + 3).Text, """", "\""")
Next
For i = TableLayoutPanel1.RowCount - 1 To 3 Step -1
TableLayoutPanel1.RowCount = TableLayoutPanel1.RowCount - 1
TableLayoutPanel1.Controls.Remove(TableLayoutPanel1.GetControlFromPosition(0, i))
TableLayoutPanel1.Controls.Remove(TableLayoutPanel1.GetControlFromPosition(1, i))
TableLayoutPanel1.Controls.Remove(TableLayoutPanel1.GetControlFromPosition(2, i))
Next
End If
TableLayoutPanel1.RowCount = 4
txtQText.Text = arrQuestion(intSelectedRowIndex).questionText_eng
txtOpt1.Text = arrQuestion(intSelectedRowIndex).choice_eng
txtQText_New.Text = arrQuestion(intSelectedRowIndex).questionText
txtOpt1_New.Text = arrQuestion(intSelectedRowIndex).choice
TableLayoutPanel1.RowCount = TableLayoutPanel1.RowCount - 1
Dim intRowIndex As Integer = TableLayoutPanel1.RowCount
For i As Integer = 0 To arrQuestion(intSelectedRowIndex).cText_eng.Length - 1
Dim lbl As Label = New Label()
lbl.AutoSize = True
lbl.Font = New System.Drawing.Font("Arial", 11.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
lbl.Size = New System.Drawing.Size(73, 36)
lbl.TabIndex = 5
lbl.Text = "Line" + arrQuestion(intSelectedRowIndex).cText_eng(i).lineId.ToString
Dim TxtBox1 As dynamicTextBox = New dynamicTextBox()
TxtBox1.Text = arrQuestion(intSelectedRowIndex).cText_eng(i).line
Dim TxtBox2 As TextBox = New TextBox()
TxtBox2.Font = New System.Drawing.Font("Mangal", 13.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
TxtBox2.MaxLength = 50000
TxtBox2.Size = New System.Drawing.Size(600, 37)
TxtBox2.TabIndex = 16
TxtBox2.Text = arrQuestion(intSelectedRowIndex).cText(i).line
TableLayoutPanel1.RowCount = TableLayoutPanel1.RowCount + 1
TableLayoutPanel1.Controls.Add(lbl, 0, intRowIndex)
TableLayoutPanel1.Controls.Add(TxtBox1, 1, intRowIndex)
TableLayoutPanel1.Controls.Add(TxtBox2, 2, intRowIndex)
intRowIndex = TableLayoutPanel1.RowCount
Next
End If
lockThis = False
End If
Catch ex As Exception
End Try
End Sub
答案 0 :(得分:0)
查看SuspendLayout()和ResumeLayout()函数以帮助解决闪烁问题。对于另一部分,没有任何代码很难确定。一种可能性是你在任何地方使用Appliation.DoEvents()。这可能会导致一个线程在先前实例完成之前调用您的方法的问题,这可能会创建您描述的结果类型。
答案 1 :(得分:0)
这样做的几种方法
在事件处理程序中的代码运行时禁用该按钮
添加一个布尔属性,测试是否为true,将其设置为true,将你的东西设置为false。
请确认您是否可以排队“编辑请求”并在后台进行大量工作。
第二个将是我的选择,快速获胜。
而且......
“继续点击”
后各行的编辑按钮您的所有编辑按钮都具有相同的处理程序吗?
鉴于你已经完成了
if (!_inhibit)
{
try
{
_inhibit = true;
// mess with template
}
finally
{
_inhibit = false;
}
}
只是不知道怎么会出错。如果你放一个调试_inhibit = true
,它应该永远不会到达那里,除非处理程序代码已经完成。鉴于这是真的,你认为错的不是。
答案 2 :(得分:0)
使用单元格clickevent,而不是像这样
Private Sub DataGridView1_CellClick(sender As Object,e As DataGridViewCellEventArgs)处理DataGridView1.CellClick
当用户点击表格中的文字时,单元格内容点击工作会产生令人困惑的用户体验