gpt4 book ai didi

c# - Ticker 生成的表格显示不正确

转载 作者:行者123 更新时间:2023-11-30 21:07:41 24 4
gpt4 key购买 nike

希望这不会太难理解。

我目前正在开发一个在后台安静运行的小型时间记录应用程序。每次行情结束时,应用程序都会提示用户说出自上次提示后他/她在做什么。我最终会让应用程序将数据写入电子表格。

到目前为止,我有一个选项允许用户选择他/她是否想要使用默认提示设置(每次错过提示时,它都会保持可见,直到创建下一个提示,这意味着如果用户离开他/她的计算机一段时间,屏幕上可能只有很少的提示等待填写)或者想要组合所有提示(每次错过一个提示并弹出一个新提示时,旧的关闭,新的覆盖旧提示和新提示的时间)。

用户还可以选择一个复选框来关闭提示。当他/她再次打开提示时,会弹出一个提示,要求用户填写他/她在关闭提示时所做的事情(在用户运行全屏应用程序等时很有用)。

我的问题是,当我尝试生成提示时,它们无法正确显示。我根本无法操纵它们,而且没有任何控件显示。它们基本上看起来像空表格。

这是我使用代码生成提示的代码:

public void ticker(object source, System.Timers.ElapsedEventArgs e)
{
if (groupMissed)
{
incrementsMissed += 1;
if (incrementsMissed > 1)
{
IncrementForm form = (IncrementForm)Application.OpenForms["IncrementForm"];
if (form.InvokeRequired)
{
form.Invoke(new MethodInvoker(delegate { form.Close(); }));
}
}
}
else
{
incrementsMissed = 1;
}

IncrementForm theIncrementForm = new IncrementForm(this, e.SignalTime);
theIncrementForm.Show();
latestIncrement = e.SignalTime;
}

这是我使用“关闭提示”复选框生成提示的代码:

private void chkbxAlerts_Click(object sender, EventArgs e)
{
if (!chkbxAlerts.Checked)
{
// Ensures that the time missed is covered and restarts the timer
DateTime now;
now = DateTime.Now;
if ((now - latestIncrement).TotalMinutes >= 1) // Only records time if it is equal to or greater than one minute
{
// TO-DO: FIX
if (groupMissed)
{
incrementsMissed += 1;
if (incrementsMissed > 1)
{
IncrementForm form = (IncrementForm)Application.OpenForms["IncrementForm"];
if (form.InvokeRequired)
{
form.Invoke(new MethodInvoker(delegate { form.Close(); }));
}
}
}
else
{
incrementsMissed = 1;
}
IncrementForm theIncrementForm = new IncrementForm(this, now, latestIncrement);
theIncrementForm.Show();
latestIncrement = now;
}
timer.Enabled = true;
}
else
{
// Stops the timer
timer.Enabled = false;
}
}

如果您需要任何进一步的说明,请告诉我。非常感谢您的帮助,这一直困扰着我。

最佳答案

System.Timers.Timer 有一个 SynchronizingObject属性(property)。如果将其设置为主窗体(或包含计时器的窗体),则将在 GUI 线程上引发计时器滴答事件。

请注意 System.Timers.Timer 有吞噬 Elapsed 事件中发生的异常的恶习。如果您的滴答处理程序抛出异常,您将永远看不到它。这是一个讨厌的错误隐藏者。因此,我建议使用 System.Windows.Forms.TimerSystem.Threading.Timer。如果您使用 Windows 窗体计时器,则会在 GUI 线程上引发 elapsed 事件。如果您使用 System.Threading.Timer,则必须使用 Invoke,如 NSGaga 在他的回答中所示。

参见 Swallowing exceptions is hiding bugs有关为什么我不鼓励使用 System.Timers.Timer 的更多信息。

关于c# - Ticker 生成的表格显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10220172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com