那菈麻木 2025-03-17 22:10 采纳率: 50%
浏览 33
已结题

C#,Winform 使用全局静态变量,赋值给label不更新值

C#,Winform 使用全局静态变量不更新值
我用了一个串口接收数据,定义了一个全局静态变量存储这个数据
在一个窗体,使用容器和按键做了多个页面和切换页面,目前就是页面调用这个全局变量的数据,不更新数据,比如我接收到数据12,然后后面我关掉串口,又接收一次数据13,但是label的文本值不会边成13,想请教各位怎么解决这个问题

下面我把我代码简略写一下


//定义全局静态变量,在页面1
   public static class PublicValue
    {
        public static ushort[] result0x03;
    }

//将串口接收到的值赋值给静态变量,在页面8
 PublicValue.result0x03 = ReadHoldingRegisters();

//然后在页面2调用值给一个文本变量
if( PublicValue.result0x03 !=null)
         {
         label.Text = PublicValue.result0x03[10].ToString() + " ";
         label.Refresh();
        }
  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-03-17 22:18
    关注
    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供,如果还有疑问可以点击头像关注私信或评论
    如果答案让您满意,请采纳、关注,非常感谢!

    在你的代码中,虽然你更新了全局静态变量 PublicValue.result0x03,但 label 的文本并没有自动更新。这是因为 label 的文本值只在页面2加载时被设置一次,之后即使 PublicValue.result0x03 发生变化,label 也不会自动更新。

    要解决这个问题,你需要在 PublicValue.result0x03 发生变化时,手动通知页面2更新 label 的文本。你可以通过事件或委托来实现这一点。

    解决方案1:使用事件通知页面2更新

    1. 定义事件:在 PublicValue 类中定义一个事件,当 result0x03 发生变化时触发该事件。
    public static class PublicValue
    {
        public static ushort[] result0x03;
        public static event Action DataUpdated;
    
        public static void UpdateResult0x03(ushort[] newData)
        {
            result0x03 = newData;
            DataUpdated?.Invoke();
        }
    }
    
    1. 在页面8中更新数据并触发事件
    PublicValue.UpdateResult0x03(ReadHoldingRegisters());
    
    1. **在页面2中订阅事件并更新 label**:
    public partial class Page2 : Form
    {
        public Page2()
        {
            InitializeComponent();
            PublicValue.DataUpdated += UpdateLabel;
        }
    
        private void UpdateLabel()
        {
            if (PublicValue.result0x03 != null)
            {
                label.Text = PublicValue.result0x03[10].ToString() + " ";
                label.Refresh();
            }
        }
    
        private void Page2_FormClosed(object sender, FormClosedEventArgs e)
        {
            PublicValue.DataUpdated -= UpdateLabel;
        }
    }
    

    解决方案2:使用委托

    1. 定义委托:在 PublicValue 类中定义一个委托,用于通知页面2更新 label
    public static class PublicValue
    {
        public static ushort[] result0x03;
        public static Action UpdateLabel;
    
        public static void UpdateResult0x03(ushort[] newData)
        {
            result0x03 = newData;
            UpdateLabel?.Invoke();
        }
    }
    
    1. 在页面8中更新数据并调用委托
    PublicValue.UpdateResult0x03(ReadHoldingRegisters());
    
    1. **在页面2中设置委托并更新 label**:
    public partial class Page2 : Form
    {
        public Page2()
        {
            InitializeComponent();
            PublicValue.UpdateLabel = UpdateLabel;
        }
    
        private void UpdateLabel()
        {
            if (PublicValue.result0x03 != null)
            {
                label.Text = PublicValue.result0x03[10].ToString() + " ";
                label.Refresh();
            }
        }
    
        private void Page2_FormClosed(object sender, FormClosedEventArgs e)
        {
            PublicValue.UpdateLabel = null;
        }
    }
    

    总结

    通过使用事件或委托,你可以在 PublicValue.result0x03 发生变化时通知页面2更新 label 的文本。这样,无论 PublicValue.result0x03 如何变化,label 都会自动更新为最新的值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月17日