如何在C# VSTO窗体中实现支持选中Excel单元格的类RefEdit文本框
VSTO实现内置RefEdit选区功能方案
问题根源
你遇到的无法选中工作表单元格的核心原因是:默认调用ShowDialog()打开的是模态窗体,会阻塞Excel主窗口的所有交互操作。
实现步骤
1. 调整窗体显示属性
打开窗体时不要使用模态弹窗模式,改用非模态的Show()方法,同时绑定Excel主窗口为父窗体,避免窗体被Excel界面遮挡:
// 窗体调用代码,写在你的AddIn逻辑中 var customForm = new YourCustomForm(); customForm.Show(); // 若出现窗体被Excel遮挡的情况,可传入Excel窗口句柄作为父窗口 // customForm.Show(new NativeWindowWrapper((IntPtr)Globals.ThisAddIn.Application.Hwnd));
2. 添加选区监听逻辑
在你的自定义窗体代码中,通过监听Excel的SheetSelectionChange事件实现选区信息自动同步,仅在目标文本框激活时生效:
// 窗体类全局变量,标记当前是否处于选区监听状态 private bool _isRangeSelecting = false; // 目标文本框的激活事件,绑定到你要显示选区信息的文本框 private void txtRange_Enter(object sender, EventArgs e) { _isRangeSelecting = true; // 订阅Excel选区变化事件 Globals.ThisAddIn.Application.SheetSelectionChange += OnSheetSelectionChange; } // 目标文本框的失去焦点事件 private void txtRange_Leave(object sender, EventArgs e) { _isRangeSelecting = false; // 取消事件订阅避免多余触发 Globals.ThisAddIn.Application.SheetSelectionChange -= OnSheetSelectionChange; } // Excel选区变化的处理逻辑 private void OnSheetSelectionChange(object sh, Excel.Range target) { if (!_isRangeSelecting) return; // 同步选区地址和值到文本框,格式可自定义调整 txtRange.Text = $"地址:{target.Address[false, false]} | 值:{target.Value2?.ToString() ?? string.Empty}"; } // 窗体关闭事件,务必取消事件订阅避免内存泄漏 private void YourCustomForm_FormClosed(object sender, FormClosedEventArgs e) { Globals.ThisAddIn.Application.SheetSelectionChange -= OnSheetSelectionChange; }
可选优化
如果需要实现和VBA RefEdit完全一致的点击折叠窗体选区域的效果,可在文本框旁添加一个折叠按钮,点击时临时缩小窗体高度,选区完成后再恢复原窗体尺寸即可。
内容的提问来源于stack exchange,提问作者Shaif hassan
相关产品推荐
相关产品推荐

