Datagridview cellcontentclick事件没有时间完成

时间:2012-04-11 13:22:14

标签: .net vb.net winforms datagridview

我有一个DataGridView,每行都有一个与Button相关的编辑。

CellContentClick事件中,我在textbox

中动态删除并创建了LabelTableLayoutPanel个控件的数量

这种动态删除和控制创建需要花费一些时间也会闪烁(这不是一个很大的问题)。

但问题是,如果有人在一段时间后不断点击各行的编辑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

3 个答案:

答案 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

当用户点击表格中的文字时,单元格内容点击工作会产生令人困惑的用户体验