Я искал это и в Google, и здесь, и не смог найти решение / причину.
Я работаю над надстройкой Excel в Visual Studio 2019, в которой перечислены рабочие листы в текущемРабочая книга в ListView.Я также добавил в окно 2 кнопки, одна с надписью «Вверх», а другая «Вниз».При нажатии этих кнопок элемент ListView.SelectedItem должен быть перемещен либо до, либо после его текущей позиции.
Этого не происходит, вместо этого я получаю System.Runtime.InteropServices.COMException (HRESULT=0x800A03EC), "Cannot evaluate the exception source"
.Я не могу понять, что является причиной этого, так как согласно Microsoft Docs код, который я использую, является правильным.Может кто-нибудь взглянуть на код и посмотреть, если они заметили что-то, что я делаю неправильно, пожалуйста?
Код
(закомментированный код в функции ChangeSheetOrderбыл мой первоначальный подход, прежде чем найти код Microsoft Doc.)
WorksheetsListBox
это ListView
public partial class DocumentWorksheets : Form
{
List<Worksheet> sheets = new List<Worksheet>();
List<string> sheetNames = new List<string>();
Excel.Workbook currentWorkbook = Globals.ThisWorkbook.Application.ActiveWorkbook as Excel.Workbook;
public DocumentWorksheets()
{
InitializeComponent();
CatalogWorksheets();
}
public void CatalogWorksheets()
{
sheets.Clear();
int numSheets = currentWorkbook.Sheets.Count;
for (int i = 1; i < numSheets; i++)
{
sheets.Add((Excel.Worksheet)currentWorkbook.Sheets[i]);
}
foreach (Worksheet sheet in sheets)
{
sheetNames.Add(sheet.Name);
}
WorksheetsListBox.DataSource = sheetNames;
IsDirty();
}
public void IsDirty()
{
WorksheetsListBox.Refresh();
}
private void MoveUpButton_Click(object sender, EventArgs e)
{
ChangeSheetOrder(true);
IsDirty();
}
private void MoveDownButton_Click(object sender, EventArgs e)
{
ChangeSheetOrder(false);
IsDirty();
}
public void ChangeSheetOrder(bool directionIsUp)
{
Worksheet selected = Globals.ThisWorkbook.Worksheets[WorksheetsListBox.SelectedIndex];
int currentIndex = selected.Index + 1;
if (directionIsUp)
{
((Excel.Worksheet)currentWorkbook.ActiveSheet).Move(currentIndex + 1);
//selected.Move(Before: Globals.ThisWorkbook.Worksheets[WorksheetsListBox.SelectedIndex]);
}
else
{
((Excel.Worksheet)currentWorkbook.ActiveSheet).Move(currentIndex - 1);
//selected.Move(After: Globals.ThisWorkbook.Worksheets[WorksheetsListBox.SelectedIndex]);
}
CatalogWorksheets();
}
private void WorksheetsListBox_SelectedIndexChanged(object sender, EventArgs e)
{
int selectedItem = WorksheetsListBox.SelectedIndex + 1;
//Added to prevent firing before Window fully loaded and ListView Collection created
if (this.IsHandleCreated)
{
((Excel.Worksheet)currentWorkbook.Sheets[selectedItem]).Select();
}
IsDirty();
}
private void WorksheetsListBox_Layout(object sender, LayoutEventArgs e)
{
MessageBox.Show("Redrawn");
}
}