【问题标题】:Add a timer for every row added to dataGridView and remove it if row deleted为添加到 dataGridView 的每一行添加一个计时器,如果行被删除,则将其删除
【发布时间】:2013-03-18 17:13:07
【问题描述】:

我正在尝试为添加到 dataGridView 的每一行添加一个计时器,并在删除一行时将其删除。

由于错误,我根本无法让计时器运行:

“System.Timers.Timer”不包含“Tick”的定义,并且找不到接受“System.Timers.Timer”类型的第一个参数的扩展方法“Tick”(您是否缺少 using 指令或程序集参考?)

当前上下文中不存在名称“myTimer_Tick”

这是我所拥有的一个例子:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Media;
using System.Data.OleDb;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Timers;

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    System.Timers.Timer myTimer = new System.Timers.Timer();
    myTimer.Interval = 30000;
    myTimer.Tick += new EventHandler(myTimer_Tick);
    myTimer.Enabled = true;
    myTimer.Start();
}

public void MyTimer_Tick(object sender, EventArgs e)
{
    MessageBox.Show("30 seconds scince you added a row");
}

private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
    //remove a timer here that corresponds to this row, 
    //if row removed before timer elapsed
}

感谢您对我的任何帮助。

【问题讨论】:

    标签: c# datagridview timer


    【解决方案1】:

    你应该使用

    System.Windows.Forms.Timer
    

    代替

    using System.Timers;
    

    参见herehere

    【讨论】:

    • 好的,我已经改成这样了,谢谢。它们都产生相同的结果。我无法用它们中的任何一个删除计时器,并且计时器不断重复。我该如何阻止这种情况?
    【解决方案2】:

    首先,System.Timer 没有 .Tick 事件。请改用Timer.Elapsed

    myTimer.Elapsed += new EventHandler(MyTimer_Tick);
    

    [编辑:用字典替换列表]

    您还需要多个计时器以及将计时器保持在范围内的方法。使用在类级别声明的Dictiory<DataGridViewRow, Timer> 对象:

    private Dictionary<DataGridViewRow, System.Timers.Timer> timers = new Dictionary<DataGridViewRow, System.Timers.Timer>();
    
    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        var myTimer = new System.Timers.Timer();
        myTimer.Interval = 30000;
        myTimer.Elapsed += new ElapsedEventHandler(MyTimer_Tick);
        myTimer.Enabled = true;
    
        // Potential bug source: If you programmatically add multiple rows at once,
        // a timer is only added to the first row
        timers.Add(dataGridView1.Rows[e.RowIndex], myTimer);
    }
    

    现在在 RowsRemoved 事件处理程序中,您获取行索引并将其从 timers 字典中删除;例如,timers.RemoveAt(rowIndex)

    【讨论】:

    • 这仍然让我在 EventHandler 行上出错。我可以通过使用 myTimer.Elapsed += new ElapsedEventHandler(MyTimer_Tick); 来抑制它对吗?
    • 如果Rows 集合以某种方式重新排序,您的行集合索引将与timers 索引不匹配。将 Row 引用作为 Dictionary&lt;DataRow, Timer&gt; 集合的键将不太可能由于索引不匹配而导致冲突。
    • 这是真的,我没想到。允许用户重新排列行,但不允许重新排列列。如何使用 Dictionary 添加它?
    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多