我想制作一个警报程序,要求用户选择时间和星期几。如果用户选择日期,则标签中的文本将以粗体显示。我无法将列表从button2_click传递到Timer_Elapsed。该程序运行良好,除非按下按钮,Timer_Elapsed中的函数不起作用。
List<string> list = new List<string>();
private void Form1_Load(object sender, EventArgs e)
{
timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Elapsed += Timer_Elapsed;
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
DateTime currentTime = DateTime.Now;
DateTime userTime = dateTimePicker1.Value;
foreach(string _list in list)
{
if(currentTime.DayOfWeek.Equals(_list) && currentTime.Hour==userTime.Hour && currentTime.Minute==userTime.Minute && currentTime.Second == userTime.Second)
{
SoundPlayer player = new SoundPlayer();
player.SoundLocation = @"C:\Users\Andrew\Music\test1.wav";
player.PlayLooping();
if(MessageBox.Show("","It's Time!", MessageBoxButtons.OK)==DialogResult.OK)
{
player.Stop();
}
}
}
}
private void button2_Click(object sender, EventArgs e)
{
timer.Start();
if (label3.Font.Bold)
{
list.Add("Monday");
}
if (label4.Font.Bold)
{
list.Add("Tuesday");
}
if (label5.Font.Bold)
{
list.Add("Wednesday");
}
if (label6.Font.Bold)
{
list.Add("Thursday");
}
if (label7.Font.Bold)
{
list.Add("Friday");
}
if (label8.Font.Bold)
{
list.Add("Saturday");
}
if (label9.Font.Bold)
{
list.Add("Sunday");
}
foreach (string _list in list)
{
label10.Text = label10.Text + _list + " ";
}
label10.Visible = true;
}
private void label3_Click(object sender, EventArgs e)
{
label3.Font = new Font(label3.Font, FontStyle.Bold);
}
private void label4_Click(object sender, EventArgs e)
{
label4.Font = new Font(label4.Font, FontStyle.Bold);
}
private void label5_Click(object sender, EventArgs e)
{
label5.Font = new Font(label5.Font, FontStyle.Bold);
}
private void label6_Click(object sender, EventArgs e)
{
label6.Font = new Font(label6.Font, FontStyle.Bold);
}
private void label7_Click(object sender, EventArgs e)
{
label7.Font = new Font(label7.Font, FontStyle.Bold);
}
private void label8_Click(object sender, EventArgs e)
{
label8.Font = new Font(label8.Font, FontStyle.Bold);
}
private void label9_Click(object sender, EventArgs e)
{
label9.Font = new Font(label9.Font, FontStyle.Bold);
}
private void button1_Click(object sender, EventArgs e)
{
label3.Font = new Font(label3.Font, FontStyle.Regular);
label4.Font = new Font(label4.Font, FontStyle.Regular);
label5.Font = new Font(label5.Font, FontStyle.Regular);
label6.Font = new Font(label6.Font, FontStyle.Regular);
label7.Font = new Font(label7.Font, FontStyle.Regular);
label8.Font = new Font(label8.Font, FontStyle.Regular);
label9.Font = new Font(label9.Font, FontStyle.Regular);
}
答案 0 :(得分:1)
在if语句中,您正在将SELECT USR.FULLNAME,
AUDUSR.LAST_LOGGED_IN_DATE
FROM SYSTEMUSERBASE AS USR
INNER JOIN (SELECT DISTINCT AB.OBJECTID AS USERID,
MAX(AB.CREATEDON) AS LAST_LOGGED_IN_DATE
FROM SYSTEMUSERBASE AS USR
LEFT OUTER JOIN AUDITBASE AS AB
ON USR.SYSTEMUSERID = AB.USERID
WHERE ( AB.ACTION = 64 )
OR ( AB.ACTION = 65 )
GROUP BY AB.OBJECTID
HAVING ( MAX(AB.CREATEDON) <=
DATEADD(MONTH, @monthsInactiveFor,
GETDATE()) )
UNION
SELECT OBJECTID AS USERID,
NULL AS LAST_LOGGED_IN_DATE
FROM AUDITBASE
GROUP BY OBJECTID
HAVING MAX(CASE
WHEN ACTION = 64
OR ACTION = 65 THEN 1
ELSE 0
END) = 0) AS AUDUSR
ON USR.SYSTEMUSERID = AUDUSR.USERID
WHERE ( USR.ISDISABLED = 0 )
AND ( USR.CREATEDON <= DATEADD(MONTH, @monthsInactiveFor, GETDATE()) )
AND ( USR.ACCESSMODE = 0 )
ORDER BY AUDUSR.LAST_LOGGED_IN_DATE, USR.FULLNAME
枚举值与字符串DayOfWeek
进行比较,这将始终为false。改变:
currentTime.DayOfWeek.Equals(_list)
答案 1 :(得分:0)
就像Giorgi说的那样,你正在将Enum与字符串进行比较。你之前需要使用ToString()。
至于你的其余代码,这里有几个指针可以让它整体更好,因为你似乎已经开始了。如果您不理解其中一个提示,请尝试阅读它。理解为什么它更好比仅仅盲目地改变它更重要。大多数技巧都是非常简化的指针,而且水平也非常基本。
点击标签,将其粗体旋转或将其恢复正常,具体取决于其当前状态。这将允许用户轻松地删除其中一个。这将使button1也无关紧要。
label3.Font = new Font(label3.Font, label3.Font.Bold ? FontStyle.Regular : FontStyle.Bold);
允许button2通过再次单击来停用闹钟。
不要硬编码声音的路径,而是将其作为资源包含,或者只是将其放在包含可执行文件的文件夹中并使用相对路径
没有人需要警报到第二个。使计时器间隔约30秒左右(以避免毫秒错误),并比较分钟。
如果警报已经响起,请不要启动警报
保护您的危险代码,例如找到声音文件,或者事先检查它是否存在(并做出适当的反应),或者通过简单的尝试捕捉,以便您的程序在关键时刻不会崩溃。
将枚举值(来自DayofWeek)添加到列表中,然后您无需转换任何内容来比较它们
更好地命名表单控件和变量,以便从名称中明显地使用它们。 “label3”,“button2”,“list”是变量的可怕名称,尤其是全局变量。
考虑到在响铃时您没有提供除“OK”之外的任何其他选项,请不要测试对话框响应。
player.PlayLooping();
MessageBox.Show("", "It's time!");
player.Stop();
对所有标签点击使用相同的功能,如下所示:
private void labelDay_Click(object sender, EventArgs e)
{
Label currentLbl = (label) sender;
currentLbl.Font = new Font(currentLbl.Font, currentLbl.Font.Bold ? FontStyle.Regular : FontStyle.Bold);
}
将所有标签保存在一个数组中,以便您可以通过点击按钮循环显示它们
使用差异比较时间,这样您就不必比较天数,小时数,分钟数等。可以在一次操作中轻松比较日期时间。
WinForms有一个可以在编辑器中使用的计时器组件
完成后再处理SoundPlayer或重新使用它。 C#在幕后为您解决这个问题,但这是一般学习编程的好习惯
这应该是学习一些关于C#和WinForms的非常有用的东西,并开始使用更好的代码实践的良好开端。这绝不是可以改进的所有内容的详尽列表,但由于你可能不打算将这个程序变成一个全世界使用的软件,这应该是你的一个很好的垫脚石。 / p>