簡體   English   中英

如何使用 Delete 鍵刪除 Excel 列表對象列?

[英]How to delete an Excel listobject column with the Delete key?

當 Excel 列表對象中的活動單元格是列標題時,我想以編程方式(在 C# 中)處理按下 DEL 鍵,相當於刪除該列。 目前,如果我按 DEL 鍵,標題名稱將更改為 Excel 自動生成的默認名稱(例如 List1,或在我的德國版 Excel 中的 Spalte1)。

為 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 支持的所有可能語言的默認名稱列表進行比較?

下面是我的想法。 它基於以下工作表:
在此處輸入圖片說明

與列表對象“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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM