【问题标题】:Wait for button click while reading or during a loop在阅读或循环期间等待按钮单击
【发布时间】:2019-05-16 00:29:01
【问题描述】:

我正在创建一个时钟程序。我们的办公室工作人员希望能够在特定员工打卡时向他们发送消息。我遇到的问题是,如果要显示多条消息,它会循环到最后一条。

while(reader.Read()
{
     richtextbox.Text = reader["Message"].ToString();
     //need to pause here and wait for them to press the acknowledge button
{

有没有办法等待或暂停,直到按下确认按钮。

感谢任何帮助。

ps。我尝试过使用

public static class Utils
{
    public static Task WhenClicked(this Control target)
    {
        var tcs = new TaskCompletionSource<object>();
        EventHandler onClick = null;
        onClick = (sender, e) =>
        {
            target.Click -= onClick;
            tcs.TrySetResult(null);
        };
        target.Click += onClick;
        return tcs.Task;
    }
}

来自该线程Wait until a click event has been fired C#,但它做了同样的事情并吹过按钮并再次显示最后一条消息。

【问题讨论】:

  • 这是什么程序?它的架构是什么?
  • 请显示您尝试使用WhenClicked。该解决方案应该有效
  • 我不确定你想让我给你看什么。 while(reader.Read() { richtextbox.Text = reader["Message"].ToString(); WhenClicked(button1); { 这是我在代码中输入的内容。但就像我说的那样,它跳过了所有其他消息并刚刚展示了最后一个。有什么具体的需要我展示吗?我对此很陌生,感谢任何帮助。我现在想出的工作只是显示一个消息框,其中显示了消息消息框。它可以工作,但很烦人,我不知道该怎么做

标签: c# loops for-loop while-loop


【解决方案1】:

我会这样处理问题。让您的阅读器将所有消息加载到像队列这样的集合中(这是一个先进先出的集合,非常适合您尝试做的事情。)在循环之后,如果有任何消息,则显示第一个一。将单击事件连接到类似的代码块,每次单击按钮时都会显示下一条消息(如果存在的话)。代码如下所示:

Queue<string> EmployeeMessages = new Queue<string>();
private void OnLogin()
{
    var reader = GetReader();

    while (reader.Read())
    {
        EmployeeMessages.Enqueue(reader["Message"].ToString());
    }

    if (EmployeeMessages.Count > 0)
    {
        label1.Text = EmployeeMessages.Dequeue();
    }
}


private void button1_Click(object sender, EventArgs e)
{
    if (EmployeeMessages.Count > 0)
    {
        label1.Text = EmployeeMessages.Dequeue();
    }
}

【讨论】:

  • 就是这样!完美运行!没有足够的声誉让它显示为标记的答案,但这绝对是我想要的!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多