2017-07-27 9 views
0

Excel用のVSTO 4アドインを開発しました。完璧に動作しますが、最初に無効になっているリボンコントロールのカスタムタブに配置されたボタンがあります。リボンボタンをプログラムで有効にできません

カスタムタブで他のリボンボタンをクリックした後、最初に無効にしたボタンを有効にする必要があります。

私が試した:ボタンのClickイベントで

btnCancelar.Visible = true; 

が、ボタンは表示されません。奇妙なことに、デバッグ時にはまだ表示されませんが、MessageBoxが表示されていれば、最後にボタンが表示されます。

この現象はわかりません。コードでリボンボタンを動的に有効または無効にするにはどうすればよいですか?

答えて

0

これを回避する方法を作成しました。

簡単でした。長時間実行されていたプロセスを別のスレッドで開始しました。こうすることで、キャンセルボタンが表示され、プロセス終了後に非表示にされます。

私はRibbon.csコードでプロセスを起動するには、このコードを使用:

btnCancelar.Visible = true; 

Action action =() => { 
          Formatter.GenerateNewSheet(Formatter.TargetType.ImpresionEtiquetas, frm.CustomerID, workbook, btnCancelar); 
         }; 
System.Threading.Tasks.Task.Factory.StartNew(action); 

そして、私はこのコードを持っているプロセスメソッド内:

public static bool GenerateNewSheet(TargetType type, string customerID, Excel.Workbook workbook, Microsoft.Office.Tools.Ribbon.RibbonButton btnCancelar) 
    { 
     try 
     { 
      _cancelled = false; 
      InfoLog.ClearLog(); 

      switch (type) 
      { 
       case TargetType.ImpresionEtiquetas: 
        return GenerateTagPrinting(customerID, workbook); 
      } 

      return false; 
     } 
     finally 
     { 
      btnCancelar.Visible = false; 
     } 
    } 

私が発見した、ここで面白いことをExcelはスレッドセーフなので、新しいシートに行を追加するときや、Visibleプロパティをfalseに設定するときに同期メカニズムを追加する必要はありませんでした。

よろしく

ハイメは

0

あなたの言語があなたのプロジェクトで使用されているかどうか分かりませんが、私はあなたの言語に翻訳することができますね。私はC#で、ここでの例を紹介します:あなたはRibbonXML定義で、いわゆるコールバック関数を実装する必要が

まず:

<button id="buttonSomething" label="Content" size="large" getVisible="EnableControl"/> 

次のステップは、コールバック関数を実装することです:

public bool EnableControl(IRibbonControl control) 
{ 
    return true; // visible ... false = invisible 
} 

VSTO getVisibleコールバックをトリガーし、戻り値に応じて、可視状態を有効または無効にします(そうでない場合はコールバックがトリガされない、RibbonXMLから任意の可視性を除去することを忘れないでください)

リボンデザイナーの場合は、クリック署名が正しいことを確認する必要があります。これを行うには、リボンデザイナーのボタンをダブルクリックします。これにより、Clickメソッドが作成されます。

リボンデザイナーでリボンを作成し、2つのボタンを追加しました。最初のボタンをダブルクリックして、以下のような空のメソッドを取得し、コードを追加しました。

private void button1_Click(object sender, RibbonControlEventArgs e) 
    { 
     // Toggle button visibility and make sure the button is enabled 
     // Visible (obviously) makes it visible, while Enabled is grayed if 
     // false. You don't need this it is Enabled by default, so just for 
     // demo purposes 

     button2.Visible = !button2.Visible; 
     button2.Enabled = button2.Visible; 

     // Force Ribbon Invalidate ... 
     this.RibbonUI.Invalidate(); 

     // Long running proces 
    } 

これは完全に機能していますので、それがうまくいかない場合は、コーディングの詳細をご記入ください。

+0

こんにちは...私もC#を使用しています...しかし、私は、コールバックを追加する場所を見つけることができません。私はRibbonXMLを持っていません....私はリボンデザイナーを使用しました。コールバックをそのように追加するにはどうすればよいですか? – jstuardo

+0

リボンデザイナ(柔軟性はほとんどありませんが、ほとんどのソリューションで機能します)では、メソッドの正しい「署名」を作成しない限り、さらに簡単です。私の編集された答えを参照してください –

+0

もちろんそれはあなたのために働く。私はあなたのコードを使用してもそれも動作します。問題はこれです:ボタンを表示させた直後、私は長期的なプロセスを開始します。そのプロセスは新しいシートをデータで満たします。ユーザーがそのプロセスをキャンセルできるようにしておきたいので、プロセスを開始する前に[キャンセル]ボタンを表示する必要があります。しかし、私がApplication.DoEvents、button.Invalidateを使用してさらに多くの試みを行っても、現在のメソッドが返されたときにボタンが最後に表示されます。不思議なことは、行がどのように埋められているかを見ることができるので、Excelはプロセス中にロックされていないということです。 – jstuardo

関連する問題