You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm TextBox不显示文本:MMF读取结构体赋值后无展示问题求助

问题原因
  • 你在静态方法ReadSequence中实例化了一个全新的Form1对象,这个对象从未被渲染显示到界面上,你对它的文本框赋值自然不会反映到你当前正在操作的可见窗体上。
  • 静态方法默认无法直接访问当前窗体实例的非静态控件,这也是你之前错误新建窗体实例的诱因。
修复方案

只需要修改两处核心逻辑即可:

  1. 移除ReadSequence方法的static修饰符,让它作为窗体实例方法,可以直接访问当前窗体的所有控件
  2. 删除方法内新建Form1实例的代码,直接对当前窗体的txtBoxShowMessage控件赋值

修改后的完整代码如下:

using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;

namespace CS_MemoryMappedFile_Read_윈폼1
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct Sequence
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
        public string name;

        public long minimum;

        public long maximum;

        public long current;
    }

    public partial class Form1: Form
    {
        // 移除static修饰符
        private Sequence ReadSequence(MemoryMappedViewAccessor accessor)
        {
            Sequence seq;

            int size = Marshal.SizeOf(typeof(Sequence));
            byte[] data1 = new byte[size];
            IntPtr p = Marshal.AllocHGlobal(size);

            try
            {
                accessor.ReadArray<byte>(0, data1, 0, data1.Length);
                Marshal.Copy(data1, 0, p, size);
                seq = (Sequence) Marshal.PtrToStructure(p, typeof(Sequence));
            }
            finally
            {
                Marshal.FreeHGlobal(p);
                p = IntPtr.Zero;
            }

            // 直接给当前窗体的文本框赋值
            txtBoxShowMessage.Text = "Name: " + seq.name + Environment.NewLine + "Minimum: " + seq.minimum + Environment.NewLine + "Maximum: " + seq.maximum + Environment.NewLine + "Current Value: " + seq.current;

            return seq;
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void btnRead_Click(object sender, EventArgs e)
        {
            MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test");
            MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
            ReadSequence(accessor);
        }
    }
}

提示:如果赋值后内容显示不全,确认txtBoxShowMessage控件的Multiline属性已设置为true,且高度足够容纳多行文本。

内容的提问来源于stack exchange,提问作者Hyun Joon Jang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:09:03