【问题标题】:C# Make a button change a public valueC# 使按钮更改公共值
【发布时间】:2018-09-25 04:45:28
【问题描述】:

我在 VisualStudio 中工作。

我有这个表格:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        {

        }

        public static int signal = 0;

        public void button1_Click(object sender, EventArgs e)
        {

        }
    }
}

还有这个用户控制:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Test
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();

            if (Form1.signal == 1)
            {
                MessageBox.Show("Signal received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void UserControl1_Load(object sender, EventArgs e)
        {

        }
    }
}

当单击“Form1”中的“button1”时,我拼命尝试显示“UserControl1”中的“MessageBox”。基本上,我想在按下“button1”时将“signal”的值更改为 1。我是新手,但我在这里时间紧迫,所以非常欢迎提供很好的帮助。有任何想法吗?谢谢!

【问题讨论】:

  • 即使你在你的Form中改变了变量“signal”的值,当这种情况发生时,UserControl现在怎么可能呢?需要定义一个自定义的事件,定义对应的事件处理函数,将两者连接起来。
  • 就像我说的,我是新手,我的知识非常有限。当然,解决这个问题的最好方法是花时间学习这个程序,但不幸的是我没有那个时间。我稍后会这样做。以我的例子来说明你所说的会很棒!

标签: c# winforms button


【解决方案1】:

button1_Click 是当您单击表单中的按钮时将触发的事件。

要么像其他用户建议的那样创建一个事件,要么参考this 问题并创建一个自定义消息框,其中包含您的UserControl 作为其内容。

【讨论】:

    【解决方案2】:

    加载 UserControl 时,它会将 Form1.signal 视为 0,因为您使用该值对其进行了初始化。您的 UserControl1 永远不会知道 Form1 上的更改。

    您需要做的是在 UserControl1 中创建将触发的侦听器函数,假设每 10 毫秒触发一次,它将检查 Form1.signal == 1。

    检查 Interval 库,我建议你找时间学习一点 C#。语言很棒。

    【讨论】:

    • 我一定会这样做的!我现在时间紧迫,要做一个小项目。但是,按下按钮时信号会变为 1 吗?它将在按钮内部更改,但会在外部传输吗?我知道如何制作间隔,但我不知道如何制作听众。
    • 是的,它会的。当您更改信号变量的值时,您的侦听器函数会知道发生了类似的事情。侦听器函数将在间隔的帮助下每 10 毫秒调用一次(例如)
    • 我放了一个'await Task.Delay(10);'除了在“while”循环中带有“MessageBox”的“if”语句之外,它还有效。这是听者所想的还是图书馆中预定义的东西?
    【解决方案3】:

    处理容器之间通信的最好方法是实现一个观察者类

    观察者模式是一种软件设计模式,其中一个称为主体的对象维护其依赖项列表,称为观察者,并自动通知他们任何状态变化,通常通过调用他们的方法之一。 (维基百科)

    我这样做的方法是创建一个观察者类:

    1    public delegate void dlFuncToBeImplemented(int signal);
    2    public static event dlFuncToBeImplemented OnFuncToBeImplemented;
    3    public static void FuncToBeImplemented(int signal)
    4    {
    5         OnFuncToBeImplemented(signal);
    6    }
    

    基本上是这样:第一行说会有其他人将实现的功能

    第二行是创建一个在委托函数调用时发生的事件

    第三行是调用事件的函数的创建

    所以在你的 UserControl 中你应该添加一个这样的函数:

    private void ObserverRegister()//will contain all observer function registration
    {
        Observer.OnFuncToBeImplemented += Observer_OnFuncToBeImplemented;
        /*and more observer function registration............*/
    }
    
    
    void Observer_OnFuncToBeImplemented(int signal)//the function that will occur when  FuncToBeImplemented(signal) will call 
    {
        MessageBox.Show("Signal received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    

    在您的表单中,您应该执行以下操作:

    public static int signal = 0;
    
    public void button1_Click(object sender, EventArgs e)
    {
          Observer.FuncToBeImplemented(signal);//will call the event in the user control
    }
    

    现在,您可以将此函数注册到一大堆其他控件和容器中,它们都会收到信号

    我希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多