我有一个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();
}
}
答案 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对我没有帮助。