2

パネル ボタンをクリックするとポップアップする Excel アドインに winform ダイアログがあります。ワークシートに選択変更イベントを追加しました。イベントは初めて発生していません。ダイアログを閉じて、もう一度開く必要があります。今回はうまくいきます。ここに何か不足していますか、それとも Excel 相互運用 API のバグですか?

環境:Excel 2007、.NET 4.0、相互運用ランタイム: v1.1.4322

以下はコードです

public partial class CreateColumn : Form

    {

    public CreateColumn()
    {
        InitializeComponent();
        Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveSheet;
        //Bug: this event does not fire the first time.. works on second time.
        ws.SelectionChange += new   Excel.DocEvents_SelectionChangeEventHandler(ColRangeSelChange);

    }

    public void ColRangeSelChange(Excel.Range target) 
    {
        System.Windows.Forms.MessageBox.Show(target.AddressLocal);
    }}

これは、列の作成が呼び出される方法です

 private void smartTemplateBtn_Click(object sender, EventArgs e)
 {
      Range SelectedRange = Globals.ThisAddIn.Application.Selection;
      if (SelectedRange != null)
      {
           List<string> DataSetLabels = new List<string>();
           foreach (Range cell in SelectedRange.Cells)
           {
                if (cell.Value2 != null && !cell.Value2.Equals(""))
                {
                    if (!DataSetLabels.Contains(cell.Value2))
                    {
                        DataSetLabels.Add(cell.Value2);
                    }
                }
           }
           if (DataSetLabels.Count > 0)
           {
               PopupCreateColumnDialog(DataSetLabels);
           }
      }
 }

 public void PopupCreateColumnDialog(List<string> DataSetLabels)
 {
      if (DataSetLabels.Count > 0)
      {
           CreateColumn colDialog = new CreateColumn();
           colDialog.TopMost = true;
           colDialog.Show();
      }
 }
4

1 に答える 1

3

あなたのコメントを読んだ後、この問題 (および発生する可能性のある他の問題) は、Excel とのコミュニケーションが不十分であることが原因であると思います。したがって、この質問は、問題を引き起こさない構造を示すだけのものになります。

アプリケーションの開始時 (または特定の Excel ファイルの分析を開始するとき) に、Excel オブジェクト、ワークブック、および処理するワークシート (最初のもの) を定義する必要があります。あなたの例に従って、ワークシートに焦点を当てます。

Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveSheet;
ws.SelectionChange += new   Excel.DocEvents_SelectionChangeEventHandler(ColRangeSelChange);

は次のようColRangeSelChangeに定義されています。

public void ColRangeSelChange(Excel.Range target) 
{
    System.Windows.Forms.MessageBox.Show(target.AddressLocal);
}

このスプレッドシートを扱う間、この定義を変更する必要はありません。指定されたメソッド ( ColRangeSelChange) が指定されたイベント (ColRangeSelChange) に関連付けられ、イベントがトリガーされるたびに呼び出されます。ワークシートとイベントを再定義し続けると、調整に関する問題が発生し、奇妙な状況が発生する可能性があります。

別のスプレッドシートを (ActiveSheetもう一度、または他の方法で) 説明したい場合は、このプロセス (変数の割り当てとイベントの割り当て) を他の変数でやり直すか、同じものを保持する必要があります。

まとめ: からワークシートとイベント定義の両方を削除しCreateColumn()ます。これを、指定されたワークシートとの対話を開始する直前 ( の前smartTemplateBtn_Click) に配置します。また、イベントを 1 回だけ (開始時に) 定義し、指定されたワークシートを変数に 1 回だけ (開始時に) 割り当てるようにしてください。

于 2013-08-23T09:50:42.440 に答える