c#"this method or property is not available because the current selection partially covers a plain text content control."

c# "this method or property is not available because the current selection partially covers a plain text content control."

我在 Microsoft Word 文档级自定义中将行(即过程)添加到 table 中时遇到方法 (AddProcedure(Procedure procedure, Word.Table table, int procedureCol, int initialsCol, int dateCol) ) 的问题。

每一行在第 1 列包含一个描述,在第 7 列包含一个下拉列表内容控件,在第 9 列包含一个日期选择器内容控件。添加哪些过程应该取决于字符串成员的值 "engagementType"。

当使用示例 engagementType(即 "Audit")初始化 engagementType 时,一切正常。但是当 engagementType 用空字符串初始化然后在事件处理程序中分配值 "Audit" 时,事件处理程序调用 SetupProcedures 方法然后调用 AddProcedure 方法(我相信是有问题的方法)只有一行被添加到列中的描述1,然后在尝试添加下拉列表内容控件时在第 7 列失败。

有人知道为什么会这样吗?

这是我的代码:

public partial class ThisDocument
    {
        #region Fields

        private string engagementType = "Audit";

        #endregion Fields

        #region Events

        private void ThisDocument_Startup(object sender, System.EventArgs e)
        {
            PartnerDropdownListControl.Validated += PartnerDropdownListControl_Validated;
            UpdateUI();
        }

        private void PartnerDropdownListControl_Validated(object sender, EventArgs e)
        {
            MessageBox.Show("Partner Dropdown list Validated event handler called.");

            if (PartnerDropdownListControl.Text == "JDI")
            {
                engagementType = "Audit";
                SetupProcedures(engagementType);
            }
            else
            {
                engagementType = "Review";
                SetupProcedures(engagementType);
            }
            // throw new NotImplementedException();
        }


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

        }


        #endregion Events

        #region Methods

        private void UpdateUI()
        {
            ActiveWindow.View.TableGridlines = false;
            if(PartnerDropdownListControl.DropDownListEntries.Count == 0) PopulatePartnerDropdownList();
            if(PreparerDropdownListControl.DropDownListEntries.Count == 0) PopulatePreparerDropdownList();
            SetupProcedures(engagementType);
        }

        private void PopulatePartnerDropdownList()
        {
            RouteManager routeSheet = new RouteManager();

            foreach (string partner in routeSheet.Partners()) 
            {
                PartnerDropdownListControl.DropDownListEntries.Add(partner, partner);
            }
        }

        private void PopulatePreparerDropdownList()
        {
            RouteManager routeSheet = new RouteManager();

            foreach(string preparer in routeSheet.Preparers())
            {
                PreparerDropdownListControl.DropDownListEntries.Add(preparer, preparer);
            }
        }

        private void SetupProcedures(string engType)
        {
            Procedures procedures = new Procedures();
            Word.Table proceduresTable = this.Tables[2];

            int proceduresColumn = 1;
            int initialsColumn = 7;
            int dateColumn = 9;

            switch(engType)
            {
                case "Audit":
                    foreach(Procedure procedure in procedures.AuditProcedures())
                    {
                        AddProcedureRow(procedure, proceduresTable, proceduresColumn, initialsColumn, dateColumn);
                    }
                    break;

                case "Review":

                    foreach (Procedure procedure in procedures.ReviewProcedures())
                    {
                        AddProcedureRow(procedure, proceduresTable, proceduresColumn, initialsColumn, dateColumn);
                    }
                    break;

                case "Compilation":

                    foreach (Procedure procedure in procedures.CompilationProcedures())
                    {
                        AddProcedureRow(procedure, proceduresTable, proceduresColumn, initialsColumn, dateColumn);
                    }
                    break;

                default:
                    break;
            }

            // Add botton border to each cell in the sign-off initials column & sign-off date column.
            for (int row = proceduresTable.Rows.Count; row > 0; row--)
            {
                proceduresTable.Cell(row, initialsColumn).Borders[Word.WdBorderType.wdBorderBottom].LineStyle = Word.WdLineStyle.wdLineStyleSingle;
                proceduresTable.Cell(row, dateColumn).Borders[Word.WdBorderType.wdBorderBottom].LineStyle = Word.WdLineStyle.wdLineStyleSingle;
            }

            // Set the table Column widths.
            proceduresTable.AutoFitBehavior(Word.WdAutoFitBehavior.wdAutoFitWindow);
        }

        private void AddProcedureRow(Procedure procedure, Word.Table table, int procedureCol, int initialsCol, int dateCol)
        {
            table.Rows.Add();
            int row = table.Rows.Count;

            RouteManager routeSheet = new RouteManager();

            DropDownListContentControl signOffDropdownList;
            string signOffDropdownListName = $"signOffDropdownList{row}";
            DatePickerContentControl signOffDatePicker;
            string signOffDatePickerName = $"signOffDatePicker{row}";

            table.Cell(row, procedureCol).Range.Text = procedure.Description;

            try
            {
                MessageBox.Show("Try block called.");
                signOffDropdownList = Controls.AddDropDownListContentControl(table.Cell(row, initialsCol).Range, signOffDropdownListName);
            }
            catch (Exception)
            {
                MessageBox.Show("Catch block called.");
                throw;
            }
            signOffDropdownList.PlaceholderText = "Sign-Off";

            foreach (string employee in routeSheet.Employees())
            {
                signOffDropdownList.DropDownListEntries.Add(employee, employee);
            }

            signOffDatePicker = Controls.AddDatePickerContentControl(table.Cell(row, dateCol).Range, signOffDatePickerName);
            signOffDatePicker.PlaceholderText = "Sign-Off Date";
        }

        #endregion Methods

        #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.ThisDocument_Startup);
            this.Shutdown += new System.EventHandler(this.ThisDocument_Shutdown);

        }

        #endregion

    }
}

我让它工作了。在调用 setupprocedures 方法之前,我需要 select partnerdropdownlist 内容控件之外的范围。