计时器过去后调用按钮的单击事件

时间:2013-12-06 07:18:56

标签: c# timer

我正在尝试创建一个查询数据库的表单。表单有一个“查询”按钮,我希望查询每30秒自动运行一次。但是,当我尝试这样做时,我得到一个错误,说QueryBtn需要一个对象引用,因为它是非静态的。

但是,由于表单的性质,我无法将QueryBtn更改为静态而不会导致其他问题。如何每30秒调用一次QueryBtn_Click的动作?

namespace ModalityWorklistSCU
 {
public partial class ModalityWorklistSCUExampleForm : Form
 {


 // Here's the 30 second timer

        private static System.Timers.Timer myTimer;
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            myTimer = new System.Timers.Timer();
            myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            myTimer.Interval = 30000;
            myTimer.Enabled = true;
            Application.Run(new ModalityWorklistSCUExampleForm());
        }

//这是表格

public ModalityWorklistSCUExampleForm()
    {
        InitializeComponent();
    }

//这定义了计时器过去时会发生什么。我试图调用另一个按钮的click事件。

    private static void OnTimedEvent(object source, ElapsedEventArgs e)

            {   
            QueryBtn.PerformClick();
            }

//这是我想要每5秒调用一次的事件:

private void QueryBtn_Click(object sender, EventArgs e)
    {
        DCXOBJIterator it = null;
        DCXREQ req = null;
        DCXOBJ rp = null;
        DCXOBJ sps = null;
        DCXELM el = null;
        DCXOBJIterator spsIt = null;
        try
        {
            // Fill the query object
            rp = new DCXOBJ();
            sps = new DCXOBJ();
            el = new DCXELM();

            // Build the Scheduled procedure Step (SPS) item
            el.Init((int)DICOM_TAGS_ENUM.ScheduledStationAETitle);
            el.Value = StationNameEdit.Text;
            sps.insertElement(el);

由于

2 个答案:

答案 0 :(得分:2)

重构代码以将逻辑拉出事件处理程序。

private void QueryBtn_Click(object sender, EventArgs e)
{
    NewMethod();
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{   
    NewMethod();
}
private void NewMethod()
{
    DCXOBJIterator it = null;
    DCXREQ req = null;
    DCXOBJ rp = null;
    DCXOBJ sps = null;
    DCXELM el = null;
    DCXOBJIterator spsIt = null;
    try
    {
        // Fill the query object
        rp = new DCXOBJ();
        sps = new DCXOBJ();
        el = new DCXELM();

        // Build the Scheduled procedure Step (SPS) item
        el.Init((int)DICOM_TAGS_ENUM.ScheduledStationAETitle);
        el.Value = StationNameEdit.Text;
        sps.insertElement(el);
    }
}

答案 1 :(得分:1)

而不是System.Timers.Timer尝试使用System.Windows.Forms.Timer。

以下是一些信息:

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer(v=vs.110).aspx

直接从表单设计器中绘制表单上的timer元素,为Tick事件添加事件处理程序并在那里执行逻辑。您应该将所有逻辑移动到单独的函数,并从按钮Click事件和Timer事件中调用它。

您也可以直接调用按钮单击事件处理程序,就像传递所需参数的任何方法一样,但正如paqogomez正确指出的那样,这不被视为良好做法。

QueryBtn_Click(this, EventArgs.Empty).