我正在尝试创建一个查询数据库的表单。表单有一个“查询”按钮,我希望查询每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);
由于
答案 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).