none
VSTO给excel里添加控件,在移除后会导致工作簿异常 RRS feed

  • 问题

  • 用Controls.AddTextbox(或者其他Add)在excel里新增一个输入框控件,用完移除的时候用control.remove可以正常移除,但是当前工作表的功能区会变灰,复制粘贴也被禁用,不过单元格还能编辑。在切换工作表或者保存后可以恢复正常,不知道是我什么地方不对还是因为这是一个bug
    2016年5月18日 4:39

答案

  • >>>我用的是这个方法: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 外接程序项目中向工作表中添加控件

    2016年5月23日 7:36

全部回复

  • 您好 ,

    根据您的描述,据我所知我们可以使用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();
        }
    }


    所以我建议您可以提供您的示例代码,以便我们能够重现并解决您的问题。

    谢谢您的理解。

    2016年5月19日 7:10
  • 我用的是这个方法:Globals.Sheet1.Controls.AddTextBoxAddTextBox(this ControlCollection controls, double left, double top, double width, double height, string name);

    移除时:Globals.Sheet1.Controls.Remove(string name)

    2016年5月21日 5:03
  • >>>我用的是这个方法: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 外接程序项目中向工作表中添加控件

    2016年5月23日 7:36
  • 这个函数也用过,效果是一样的。

    刚试了试,发现如果btnRemove按钮是直接浮在工作表里,移除后没有问题。

    如果我用输入框失去焦点事件来移除或者把移除按钮放到功能区,结果有问题了。(补充一下:项目是excel2010文档)

    Microsoft.Office.Tools.Excel.Controls.TextBox textBox = new Microsoft.Office.Tools.Excel.Controls.TextBox();
    Globals.Sheet1.Controls.AddControl(textBox, Globals.ThisWorkbook.Application.Selection, "MineTextBox");
    textBox.LostFocus += new EventHandler(removetextbox);

    private void removetextbox(object sender, EventArgs e)
     {
                Globals.Sheet1.Controls.Remove("MineTextBox");
    }



    • 已编辑 dnzhi 2016年5月24日 5:14
    2016年5月24日 3:47
  • 根据您的描述,我尝试去重现此问题,但我没办法重现,请提供更多关于此问题的详细信息,比如完整的示例代码以及截图,这些信息有助于我们重现并解决您的问题。

    谢谢您的理解
    2016年5月25日 6:30