需要有关我的警报程序的帮助

时间:2018-05-15 17:15:12

标签: c#

我想制作一个警报程序,要求用户选择时间和星期几。如果用户选择日期,则标签中的文本将以粗体显示。我无法将列表从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);
}

2 个答案:

答案 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>