WinForm TextBox不显示文本:MMF读取结构体赋值后无展示问题求助
问题原因
- 你在静态方法
ReadSequence中实例化了一个全新的Form1对象,这个对象从未被渲染显示到界面上,你对它的文本框赋值自然不会反映到你当前正在操作的可见窗体上。 - 静态方法默认无法直接访问当前窗体实例的非静态控件,这也是你之前错误新建窗体实例的诱因。
修复方案
只需要修改两处核心逻辑即可:
- 移除
ReadSequence方法的static修饰符,让它作为窗体实例方法,可以直接访问当前窗体的所有控件 - 删除方法内新建
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
相关产品推荐
相关产品推荐

