VSTO C#单击时从文件夹添加按钮

如何解决VSTO C#单击时从文件夹添加按钮

我正在使用VSTO创建一个单词插件,我需要动态添加删除按钮和组。 我想做的是创建一个按钮,在从浏览器选择路径后单击该按钮,然后将创建一个新组(或更新现有的组),其中包含与文件夹中每个文件相关的按钮。 我唯一缺少的部分是创建和删除组和按钮,根据互联网,这绝对是可能的,但是我找不到任何指南来指导我进行操作。

当前,我有一个要插入的按钮(Doc1_Click),它会插入从下拉列表中选择的文件内容,从下拉列表中显示来自所选路径的docx,还有一个浏览按钮(browse0_Click),该按钮允许用户选择文件夹。

我创建了6个组(我的问题之一是组的数量是硬编码的,用户无法更改),这就是为什么我有2个带有6个插槽的阵列的原因。

在我看来,我想为每个按钮组创建文件夹中每个匹配的docx文件的按钮数量,并将子文件夹的数量(在主文件夹中)与组的数量相关联。

 public partial class Ribbon1
{
    String[] paths = new string[6]; //create list of paths correlated to each group 
    RibbonDropDown[] ddowns = new RibbonDropDown[6]; //create list of dropdown items for each group

    private void Ribbon1_Load(object sender,RibbonUIEventArgs e)
    {
        ddowns[0] = dropDown0;
        ddowns[1] = dropDown1;
        ddowns[2] = dropDown2;
        ddowns[3] = dropDown3;
        ddowns[4] = dropDown4;
        ddowns[5] = dropDown5;
        paths[0] = Properties.Settings.Default.path0;
        paths[1] = Properties.Settings.Default.path1;
        paths[2] = Properties.Settings.Default.path2;
        paths[3] = Properties.Settings.Default.path3;
        paths[4] = Properties.Settings.Default.path4;
        paths[5] = Properties.Settings.Default.path5;
        for (int i = 0; i < 6; i++)
        {
            actual_loader(i); // load manualy each group
        }
    }

    private void actual_loader(int num)
    {
       
        RibbonDropDownItem ddItem1;          
        ddowns[num].Items.Clear(); 
        DirectoryInfo d = new DirectoryInfo(paths[num]);
        FileInfo[] Files = d.GetFiles("*.docx"); //Getting Text files
        foreach (FileInfo file in Files)
        {
            ddItem1 = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
            ddItem1.Label = file.Name;
            ddowns[num].Items.Add(ddItem1); 
        }
    }

    private void Doc1_Click(object sender,RibbonControlEventArgs e)
    {
        GenericInsert(0);
        
    }


   //insert content from docx file into current position in file
    private void GenericInsert(int num)
    {
        if (ddowns[num].Items.Count != 0)
        {
            Word.Document doc = Globals.ThisAddIn.GetActiveDoc();
            doc.ActiveWindow.Selection.InsertFile(paths[num] + "\\" + ddowns[num].SelectedItem,"",false,false);
        }
        else
        {
        //print message Box 
        }
    }

    private void browse0_Click(object sender,RibbonControlEventArgs e)
    {
        browser(0);
    }

//allow user to choose folder
    private void browser(int num)
    {
        using (var fbd = new FolderbrowserDialog())
        {
            DialogResult result = fbd.ShowDialog();

            if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.Selectedpath))
            {
                switchFunc(num,fbd.Selectedpath); 
                paths[num] = fbd.Selectedpath; //update path array
                actual_loader(num);//refresh dropdown list 
         
            }
        }
    }

    //save new path to properties,Couldn't find any other solution so I used a switch case 
    private void switchFunc(int num,String path)
    {
        switch (num)
        {
            case 0:
                Properties.Settings.Default.path0 = path;
                break;
            case 1:
                Properties.Settings.Default.path1 = path;
                break;
            case 2:
                Properties.Settings.Default.path2 = path;
                break;
            case 3:
                Properties.Settings.Default.path3 = path;
                break;
            case 4:
                Properties.Settings.Default.path4 = path;
                break;
            case 5:
                Properties.Settings.Default.path5 = path;
                break;
        }
        Properties.Settings.Default.Save();
    }

    private void dropDown0_SelectionChanged(object sender,RibbonControlEventArgs e)
    {

    }


}

}

在此问题上的任何帮助将不胜感激。

谢谢

解决方法

您不能动态创建和删除功能区控件,但可以动态显示和隐藏它们以及更改其属性(标题,启用/禁用等)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?