在C#中更改Excel中combobox的索引

我正在写一个程序访问一个包含数据列的Excel模板(在第一列中有一个唯一的ID号)。 根据ID号码的前两个数字,该行将被保留或删除。 在模板中,这个唯一的ID号码列提供一个ActiveX Combobox(位于工作表上)ListFill属性。 当不匹配的行被删除时,ListFill属性被重置,但文本不会被重置。

例如,如果我根据'02'作为列A中唯一ID的前两个数字来select行,我没有任何问题去除所有不以'02'开头的元素,但是combobox文本仍然是“010001”,因为这是即使它不在新列表中,也是模板中的第一个唯一标识。

我告诉你所有这些问问有没有人知道更好的方法来访问combobox? 我可以作为一个OLEObject访问它,但是这不允许我改变combobox的索引或文本属性,因为它们是“只读的”,如下面VS 2013中的intellisense错误:

属性或索引器'Microsoft.Office.Interop.Excel_OLEObject.Index'不能被分配到 – 它是只读的。

错误出现在行上:

oleobj.Index = 1;

代码片段如下。 当前Excel应用程序以xlAppforms传递,并传递数组combobox。 combobox的每个成员都包含combobox所在的工作表名称,控件的名称和模板上的ListFillRange。 示例数组成员将是:

工作表Sheet1!cbTest:$ A $ 1:$ A $ 10

private void ResetComboBoxes2(string[] comboboxes, Excel.Application xlApp) { Excel.Worksheet wksht = new Excel.Worksheet(); Excel.Range rng; int listEndCellNum; string listEndCellApha; string listEndCell; for (int i = 0; i < comboboxes.Length; i++) { string[] comboBoxesSplit = comboboxes[i].Split(':'); string sheetName = comboBoxesSplit[0].ToString(); string oleObjName = comboBoxesSplit[1].ToString(); string[] rangeArray = comboBoxesSplit[2].Split(':'); string rangeStart = rangeArray[0]; listEndCellNum = wksht.Range[rangeStart].End[Excel.XlDirection.xlDown].Offset[1, 0].Row - 1; string[] cellBreakdown = rangeStart.Split('$'); listEndCellApha = cellBreakdown[1]; listEndCell = "$" + listEndCellApha + "$" + listEndCellNum; string listFull = rangeStart + ":" + listEndCell; wksht = xlApp.ActiveWorkbook.Worksheets[sheetName]; foreach (Excel.OLEObject oleobj in wksht.OLEObjects()) { if (oleobj.Name.ToString() == oleObjName) { oleobj.ListFillRange = listFull; oleobj.Index = 1; } } } } 

我甚至不确定是否有办法做到这一点。 我总是可以做一大堆的VBA代码来重置它,然后通过C#保存和访问,但我希望能在这里做到这一点。

所以我才弄明白我的想法太多了。 我回到了VBA,然后把它交给了C#。 结果是下面的代码,这会让你注意到它更简洁明了。 我必须testingoleObject的programID,对于所有的activeXcombobox是“Forms.ComboBox.1”,然后抓取该对象的名称,然后通过名称调用它,并在其中添加一个额外的“对象”,以获得更好的效果。

  private void ResetComboBoxes2(string[] comboboxes, Excel.Application xlApp) { Excel.Worksheet wksht = new Excel.Worksheet(); for (int i = 0; i < comboboxes.Length; i++) { string[] comboBoxesSplit = comboboxes[i].Split(':'); string sheetName = comboBoxesSplit[0].ToString(); wksht = xlApp.ActiveWorkbook.Worksheets[sheetName]; foreach (Excel.OLEObject oleobj in wksht.OLEObjects()) { if (oleobj.progID == "Forms.ComboBox.1")//oleobj.Name.ToString() == oleObjName) { string cbName = oleobj.Name.ToString(); wksht.OLEObjects(cbName).Object.ListIndex = 0; } } } }