Надстройка Excel: ошибка при попытке переместить лист - PullRequest
0 голосов
/ 03 апреля 2019

Я искал это и в 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");
    }
}
...