Как удалить столбец списка объектов Excel с помощью клавиши Delete? - PullRequest
0 голосов
/ 02 февраля 2020

Когда активная ячейка в объекте-листе Excel является заголовком столбца, я хотел бы программно (в C#) обрабатывать нажатие клавиши DEL как эквивалент удаления этого столбца. В настоящее время, если я нажму клавишу DEL, имя заголовка изменится на имя по умолчанию, автоматически генерируемое Excel (например, List1 или Spalte1 в моем случае немецкой версии Excel).

Перехват события нажатия клавиши для клавиша DEL - это опция, которую я бы хотел избежать, поскольку я не хочу излишне подчеркивать приложение, постоянно следя за любыми событиями нажатия клавиш.

Поэтому мне интересно, есть ли способ определить, как будет называться заголовок столбца по умолчанию после нажатия клавиши Delete, чтобы я мог реализовать обработчик события Change, который будет сравнивать содержимое нового заголовка с этим именем по умолчанию и, таким образом, интерпретировать его как действие удаления столбца (конечно, запрашивая подтверждение у пользователя!).

В обработчике события изменения код может выглядеть следующим образом (здесь предполагается, что ActiveCell - это имя столбца заголовка столбца, который должен быть удален):

string headerName = ActiveCell.Value2;
int colIdx = ActiveCell.Column - myListObject.Range.Column +1;
Excel.ListColumn columnToDelete = myListObject.ListColumns[colIdx];
if (headerName == someDefaultName)
{
    columnToDelete.Delete();
}

В любом случае, как я могу определить someDefaultName, не сравнивая его со списком имен по умолчанию для всех возможных языков, поддерживаемых Excel ??

1 Ответ

0 голосов
/ 03 февраля 2020

Ниже моя идея. Он основан на следующей рабочей таблице:
enter image description here

с ListObject "list1". Он содержит 5 столбцов. Основная идея - добавить новый столбец при запуске, перехватить его заголовок, удалить цифры из этого текста и поместить его в переменную для сравнения изменений, отправленных событием ListObject_Change. Как только кто-то нажмет Del на строке заголовка - он будет изменен на имя по умолчанию и удален. Тем не менее, он не будет удалять новый столбец с именем по умолчанию.

public partial class Sheet1
{
    // assign temp variables for header range and a column name
    // template
    public Excel.Range HeaderRange { get; set; }
    public string template;


    private void Sheet1_Startup(object sender, System.EventArgs e)
    {
        // subscribe to ListObject change event
        list1.Change += new Microsoft.Office.Tools.Excel.ListObjectChangeHandler(list1_Change);
        // get the template on start (switch of events for a while)
        this.Application.EnableEvents = false;
        GetDefaultColumnHeaderTemplate();
        this.Application.EnableEvents = true;
    }

    private void Sheet1_Shutdown(object sender, System.EventArgs e)
    {
    }


    //ListObject change event:
    void list1_Change(Microsoft.Office.Interop.Excel.Range targetRange, Microsoft.Office.Tools.Excel.ListRanges changedRanges)
    {
        // assign variables to simplify the code below
        Excel.Range Intersection = Globals.Sheet1.Application.Intersect((Excel.Range)targetRange, HeaderRange);
        HeaderRange = list1.HeaderRowRange;

        // if range is assigned - means that change was done in header row
        if (!(Intersection == null))
        {
            // make sure that changed range is only one cell
            if (Intersection.Rows.Count < 2 && Intersection.Columns.Count < 2)
            {
                // if this cell contains template - delete entire column 
                if ((targetRange.Value2).ToString().Contains(template))
                {
                    targetRange.EntireColumn.Delete();
                }
            }
        }
    }

    private void GetDefaultColumnHeaderTemplate()
    {
        // add a column with default name
        Excel.ListColumn tempColumn = list1.ListColumns.Add();

        // re-assign headers range
        HeaderRange = list1.HeaderRowRange;

        // catch the name of new column with default name
        // and remove a number  counter
        template = GetTextTemplate(HeaderRange.Cells[1, HeaderRange.Columns.Count].Value2.ToString());

        // delete temp column
        tempColumn.Delete();
    }

    private string GetTextTemplate(string tx)
    {
        string tmp = null;

        // go through each char of default column name and take only letters
        for (int i = 0; i < tx.Length; i++)
        {
            if (!double.TryParse(tx.Substring(i, 1), out _))
            {
                tmp += tx.Substring(i, 1);
            }
        }
        return tmp;
    }
        #region VSTO Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
    private void InternalStartup()
    {
        this.Startup += new System.EventHandler(this.Sheet1_Startup);
        this.Shutdown += new System.EventHandler(this.Sheet1_Shutdown);

    }

    #endregion

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...