如何防止在datagridview上快速点击?

时间:2011-04-03 07:37:47

标签: winforms datagridview

我有一个datagridview,我点击复选框列以显示第二个(可见/不可见)控件的元素。当我在checkboxcolumn快速点击时,有时在第二个控件(MapDialog)没有反应。要省略它,我想阻止用户快速点击(阻止控制0.5秒)。但我不知道该怎么做。我正在尝试SuspendLayout,但它没有帮助。

private void dgvGeoObjects_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                bool visible = (bool)dgvGeoObjectsFirstView.CurrentCell.EditedFormattedValue;
                DataRow dataRow = ((DataRowView)dgvGeoObjectsFirstView.Rows[e.RowIndex].DataBoundItem).Row;
                foreach (MapDisplayObjectBase sym in _symLayer.DisplayObjects)
                {
                    if (sym.UserObject == dataRow)
                        sym.Visible = visible;
                }

                mapControl.RefreshMap();
            }
            }

3 个答案:

答案 0 :(得分:0)

方法1:添加线程休眠。仅在您希望处理在睡眠时间内发生的点击时使用此选项。因为线程将处于睡眠模式,但点击将在睡眠时间内记录并稍后处理。

您可以使用以下代码在点击事件中等待1秒

System.Threading.Thread.Sleep(1000);

要提供的参数以毫秒为单位。

结果代码可以是:

private void dgvGeoObjects_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                bool visible = (bool)dgvGeoObjectsFirstView.CurrentCell.EditedFormattedValue;
                DataRow dataRow = ((DataRowView)dgvGeoObjectsFirstView.Rows[e.RowIndex].DataBoundItem).Row;
                foreach (MapDisplayObjectBase sym in _symLayer.DisplayObjects)
                {
                    if (sym.UserObject == dataRow)
                        sym.Visible = visible;
                }

                mapControl.RefreshMap();
                System.Threading.Thread.Sleep(100); //I think 0.1 second would be enough.
            }
            }

方法2:如果您希望在睡眠时间(例如0.01秒)内忽略点击次数,最好使用计时器。如果在睡眠时间点击一下,只需添加

e.Handled=true;

点击事件中的

答案 1 :(得分:0)

在使用睡眠和类似方法之前,请尝试找出导致问题的原因。用户快速点击不是问题!问题就像是“UI没有及时准备好”。

尝试解决这个问题;你不能阻止用户快速点击和吞咽点击会导致更多的点击和挫败感。

如果控件/ UI要慢,请尝试提供视觉线索,例如沙漏光标,进度条或禁用控件。

答案 2 :(得分:0)

我通过添加双击事件修复了它:

if (e.ColumnIndex == 0)
            {
                bool visible = (bool)dgvGeoObjectsFirstView.CurrentCell.EditedFormattedValue;
                DataRow dataRow = ((DataRowView)dgvGeoObjectsFirstView.Rows[e.RowIndex].DataBoundItem).Row;
                foreach (MapDisplayObjectBase sym in _symLayer.DisplayObjects)
                {
                    if (sym.UserObject == dataRow)
                        sym.Visible = !visible; //It's important !!
                }

                mapControl.RefreshMap();
            }

Thread.Sleep对我没有帮助。