从C#更改Excel中组合框的索引
本文关键字:索引 组合 更改 Excel | 更新日期: 2023-09-27 18:22:21
我正在编写一个程序,该程序访问包含数据列的excel模板(第一列中有一个唯一的ID号)。根据ID号的前两个数字,该行将被保留或删除。在模板中,此唯一的ID号列提供ActiveX组合框(位于工作表上)的ListFill属性。删除不匹配的行后,将重置ListFill属性,但不会重置文本。
例如,如果我根据"02"作为列A中唯一ID的前两个数字来选择行,则删除所有不以"02"开头的内容没有问题,但组合框文本仍然显示为"010001",因为这是模板中的第一个唯一ID,即使它不在新列表中。
我告诉你这一切是为了问是否有人知道访问combobox的更好方法?我可以作为OLEObject访问它,但这不允许我更改组合框的索引或文本属性,因为它们是"只读"的,因为VS 2013中出现了以下intelligense错误:
属性或索引器"Microsoft.Office.Interop.Excel_OLEObject.Index"不能归类到--它是只读的。
错误出现在以下行:
oleobj.Index=1;
下面是代码片段。当前Excel应用程序将作为xlApp传递,数组组合框也将传递。组合框数组的每个成员都包含组合框所在的工作表名称、控件名称及其在模板上的ListFillRange。数组成员示例为:
表1!: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#。结果是下面的代码,yu会注意到它相当简短和简洁。我必须测试oleObject的programID,对于所有activeX组合框,它都是"Forms.ComboBox.1",然后获取该对象的名称,然后按名称调用它,并在其中添加一个额外的"object"。
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;
}
}
}
}