积极答复者
VSTO给excel里添加控件,在移除后会导致工作簿异常

问题
答案
-
>>>我用的是这个方法:Globals.Sheet1.Controls.AddTextBoxAddTextBox(this ControlCollection controls, double left, double top, double width, double height, string name);
移除时:Globals.Sheet1.Controls.Remove(string name)<<<
根据您的描述和示例代码,我创建了一个示例程序并尝试使用您提供的示例代码,但是Controls并不提供AddTextBox的方法,所以我建议重新确认下您提供的示例代码没有错误,或者您可以参考如下代码:
private void btnAdd_Click(object sender, RibbonControlEventArgs e) { Microsoft.Office.Tools.Excel.Controls.TextBox textBox = new Microsoft.Office.Tools.Excel.Controls.TextBox(); Globals.Sheet1.Controls.AddControl(textBox,Globals.ThisWorkbook.Application.Selection, "MineTextBox"); } private void btnRemove_Click(object sender, RibbonControlEventArgs e) { Globals.Sheet1.Controls.Remove("MineTextBox"); }
更多详细信息,请点击这里以参考关于在运行时在 VSTO 外接程序项目中向工作表中添加控件
- 已建议为答案 Herro wongMicrosoft contingent staff, Moderator 2016年5月24日 1:52
- 已标记为答案 Herro wongMicrosoft contingent staff, Moderator 2016年6月8日 4:58
全部回复
-
您好 ,
根据您的描述,据我所知我们可以使用Shapes.AddTextBox方法创建一个文本框,并返回一个代表新文本框的 Shape 对象。 如果我们需要删除创建的文本框,可以使用Shape.Delete方法。我尝试创建实例以重现您的问题,但没能重现。
创建项目选择项目模板Excel 2013 Workbook
右键添加项目Ribbon(Visual Designer)
Excel.Shape textBox = null; private void btnAdd_Click(object sender, RibbonControlEventArgs e) { textBox=Globals.Sheet1.Shapes.AddTextbox( Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, 20,20,100,100); textBox.TextFrame.Characters(System.Type.Missing, System.Type.Missing).Text = "testing"; } private void btnRemove_Click(object sender, RibbonControlEventArgs e) { if (textBox != null) { textBox.Delete(); } }
所以我建议您可以提供您的示例代码,以便我们能够重现并解决您的问题。
谢谢您的理解。 -
>>>我用的是这个方法:Globals.Sheet1.Controls.AddTextBoxAddTextBox(this ControlCollection controls, double left, double top, double width, double height, string name);
移除时:Globals.Sheet1.Controls.Remove(string name)<<<
根据您的描述和示例代码,我创建了一个示例程序并尝试使用您提供的示例代码,但是Controls并不提供AddTextBox的方法,所以我建议重新确认下您提供的示例代码没有错误,或者您可以参考如下代码:
private void btnAdd_Click(object sender, RibbonControlEventArgs e) { Microsoft.Office.Tools.Excel.Controls.TextBox textBox = new Microsoft.Office.Tools.Excel.Controls.TextBox(); Globals.Sheet1.Controls.AddControl(textBox,Globals.ThisWorkbook.Application.Selection, "MineTextBox"); } private void btnRemove_Click(object sender, RibbonControlEventArgs e) { Globals.Sheet1.Controls.Remove("MineTextBox"); }
更多详细信息,请点击这里以参考关于在运行时在 VSTO 外接程序项目中向工作表中添加控件
- 已建议为答案 Herro wongMicrosoft contingent staff, Moderator 2016年5月24日 1:52
- 已标记为答案 Herro wongMicrosoft contingent staff, Moderator 2016年6月8日 4:58
-
这个函数也用过,效果是一样的。
刚试了试,发现如果btnRemove按钮是直接浮在工作表里,移除后没有问题。
如果我用输入框失去焦点事件来移除或者把移除按钮放到功能区,结果有问题了。(补充一下:项目是excel2010文档)
Microsoft.Office.Tools.Excel.Controls.TextBox textBox = new Microsoft.Office.Tools.Excel.Controls.TextBox();
private void removetextbox(object sender, EventArgs e)
Globals.Sheet1.Controls.AddControl(textBox, Globals.ThisWorkbook.Application.Selection, "MineTextBox");
textBox.LostFocus += new EventHandler(removetextbox);
{
Globals.Sheet1.Controls.Remove("MineTextBox");
}
- 已编辑 dnzhi 2016年5月24日 5:14