テーブルに行(つまり、プロシージャ)を追加するMicrosoft Word文書レベルのカスタマイズで、(AddProcedure(Procedure procedure, Word.Table table, int procedureCol, int initialsCol, int dateCol))
メソッドで問題が発生しています。c# "現在の選択部分がプレーンテキストコンテンツコントロールを部分的にカバーしているため、このメソッドまたはプロパティは使用できません。
各行には、列1の説明、列7のドロップダウンリストのコンテンツコントロール、および列9の日付ピッカーコンテンツコントロールが含まれています。追加される手順は、文字列メンバー "engagementType"の値に依存する必要があります。 。
エンゲージメントタイプをサンプルエンゲージメントタイプ(つまり「監査」)で初期化すると、すべてが完全に機能します。しかし、JoinTypeが空の文字列で初期化された後、イベントハンドラで値 "Audit"が割り当てられた後、SetupProceduresメソッドが呼び出され、次にAddProcedureメソッド(問題のメソッドと思われます)が、列1の記述に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
}
}
どのように失敗しますか?エラーメッセージが表示されますか?それは何ですか?イベントでブレークポイントを使用して、コードをステップ実行し、変数とパラメータの値をチェックすることもできます。 –
エラーメッセージはありません。 Controls.AddDropDownListControlメソッドはnullを返し、コードは引き続き実行されます。この現象は、SetupProceduresメソッドがイベントハンドラから呼び出された場合にのみ発生するように見えます。 –
上記のトピック行の引用符は、コンテンツコントロールの追加メソッドが呼び出された時点でローカルウィンドウに表示されます。 –