C# 从下拉列表中获取类型的形状

C# 从下拉列表中获取类型的形状,c#,.net,excel,excel-interop,excel-automation,C#,.net,Excel,Excel Interop,Excel Automation,这是一些我想改进的可怕代码: Excel.Shapes theShapes = excelSheet.Shapes; foreach (Excel.Shape aShape in theShapes) { foreach (var groupItem in aShape.GroupItems) { //Console.WriteLine(Microsoft.VisualBasic.Information.TypeName(groupItem));

这是一些我想改进的可怕代码:

Excel.Shapes theShapes = excelSheet.Shapes;

foreach (Excel.Shape aShape in theShapes)
{    
    foreach (var groupItem in aShape.GroupItems)
    {
        //Console.WriteLine(Microsoft.VisualBasic.Information.TypeName(groupItem));       
        var s = (Excel.Shape) groupItem;
        if (s is Excel.OLEObject) continue;
        try
        {
            if (s.FormControlType == Excel.XlFormControl.xlDropDown)
            {
                Console.WriteLine("### " + s.Name);
            }
        }
        catch (Exception e)
        {

        }
    }
}

有没有更容易获得下拉列表的方法?在尝试获取FormControlType时,如何避免上述异常

只需将
try…cath
替换为一个条件,确认它是
表单控件

Excel.Shapes theShapes = excelSheet.Shapes;

foreach (Excel.Shape aShape in theShapes)
{    
    foreach (var groupItem in aShape.GroupItems)
    {
        var s = (Excel.Shape) groupItem;
        if (s is Excel.OLEObject) continue;

        if (s.Type == Microsoft.Office.Core.MsoShapeType.msoFormControl)
        {
           if (s.FormControlType == Excel.XlFormControl.xlDropDown)
           {
               Console.WriteLine("### " + s.Name);
           }
        }
    }
}

只需将
try…cath
替换为一个条件,确认它是
表单控件

Excel.Shapes theShapes = excelSheet.Shapes;

foreach (Excel.Shape aShape in theShapes)
{    
    foreach (var groupItem in aShape.GroupItems)
    {
        var s = (Excel.Shape) groupItem;
        if (s is Excel.OLEObject) continue;

        if (s.Type == Microsoft.Office.Core.MsoShapeType.msoFormControl)
        {
           if (s.FormControlType == Excel.XlFormControl.xlDropDown)
           {
               Console.WriteLine("### " + s.Name);
           }
        }
    }
}

谢谢不幸的是,它不起作用-如果(aShape.Type==Microsoft.Office.Core.MsoShapeType.msoFormControl),它永远不会命中下面的任何内容。@csetzkorn?!应该这样。您确定要查找下拉列表吗?也许你在找一个组合框。在过滤数据时创建下拉列表;组合框是您从“开发人员”选项卡添加的控件之一。@csetzkorn实际上我现在已经测试过了,这段代码同时定位了组合框和下拉框。您是否依赖ActiveX元素?在我的场景中,我认为问题在于分组aShape.Type==msoGroup(请参见我的每个循环的第二个循环)。我不得不说,我继承了那个GUI,它一定已经分组了。@csetzkorn 1秒:你是说你原来的循环工作得很好(尽管它只是因为依赖try…catch而有点脏)?谢谢。不幸的是,它不起作用-如果(aShape.Type==Microsoft.Office.Core.MsoShapeType.msoFormControl),它永远不会命中下面的任何内容。@csetzkorn?!应该这样。您确定要查找下拉列表吗?也许你在找一个组合框。在过滤数据时创建下拉列表;组合框是您从“开发人员”选项卡添加的控件之一。@csetzkorn实际上我现在已经测试过了,这段代码同时定位了组合框和下拉框。您是否依赖ActiveX元素?在我的场景中,我认为问题在于分组aShape.Type==msoGroup(请参见我的每个循环的第二个循环)。我不得不说,我继承了那个GUI,它一定已经分组了。@csetzkorn 1秒:你是说你原来的循环工作得很好(尽管它只是因为依赖try…catch而有点脏)?