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 内容控件之外的范围。
我在 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 内容控件之外的范围。