我有一个方法,在KeyPress事件中搜索DataGridView中的一些数据,然后聚焦一个找到输入字符串的行(如果找到)。
private string input;
private void Find_Matches()
{
if (input.Length == 0) return;
for (int x = 0; x < dataGridViewCustomers.Rows.Count; x++)
for (int y = 0; y < dataGridViewCustomers.Columns.Count; y++)
if (dataGridViewCustomers.Rows[x].Cells[y].Value.ToString().Contains(input))
dataGridViewCustomers.Rows[x].Selected = true;
}
private void dataGridViewCustomers_KeyPress(object sender, KeyPressEventArgs e)
{
input += e.KeyChar.ToString();
Find_Matches();
}
如何计算按键之间的延迟,如果超过1秒,则清除“输入”字符串?这是不间断搜索的必要条件。
感谢。
答案 0 :(得分:1)
您必须使用System.Threading.Timer。 将回调传递给将清除输入的计时器。 每次引发KeyPress事件时,您都必须将计时器的间隔更新为1000毫秒
timer.Change(0,1000);
或
timer.Change(1000,0);
我不记得Change方法的正确参数序列,试试吧
答案 1 :(得分:1)
利用System.Timers.Timer
这样做:
private Timer myTimer = new Timer(1000); //using System.Timers, 1000 means 1000 msec = 1 sec interval
public YourClassConstructor()
{
myTimer.Elapsed += TimerElapsed;
}
private void TimerElapsed(object sender, EventArgs e)
{
input = string.Empty;
myTimer.Stop();
}
// this is your handler for KeyPress, which will be edited
private void dataGridViewCustomers_KeyPress(object sender, KeyPressEventArgs e)
{
if (myTimer.Enabled) myTimer.Stop(); // interval needs to be reset
input += e.KeyChar.ToString();
Find_Matches();
myTimer.Start(); //in 1 sec, "input" will be cleared
}
答案 2 :(得分:0)
您可以将Timer设置为1秒间隔,并使用KeyPress()方法重置计时器。 同时在处理程序中重置计时器。这将导致自上次击键后经过一秒钟时调用计时器的处理程序。
在计时器的处理程序内部,执行自上次击键后经过一秒钟时需要执行的操作。
我建议使用此计时器:http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
您可以通过将SynchronizingObject设置为表单/控件来回调UI线程(我认为您会想要):
http://msdn.microsoft.com/en-us/library/system.timers.timer.synchronizingobject.aspx
答案 3 :(得分:0)
首先创建一个新的System.Windows.Forms.Timer
并按如下方式对其进行配置:
_TimerFilterChanged.Interval = 800;
_TimerFilterChanged.Tick += new System.EventHandler(this.OnTimerFilterChangedTick);
然后在您的代码中添加以下方法:
private void OnTimerFilterChangedTick(object sender, EventArgs e)
{
_TimerFilterChanged.Stop();
Find_Matches();
}
您的按键事件处理程序应更改如下:
private void dataGridViewCustomers_KeyPress(object sender, KeyPressEventArgs e)
{
input += e.KeyChar.ToString();
_TimerFilterChanged.Stop();
_TimerFilterChanged.Start();
}