2010-06-15 7 views
9

utilizzando VSTO o qualche relativa tecnologia, è possibile incorporare codice un pulsante in una cella di un foglio di lavoro di Excel, e configurarlo per chiamare una funzione C# quando viene cliccato?Aggiunta di pulsanti per i fogli di calcolo in .NET (VSTO)

Come?

Grazie.

+0

Un pulsante non può essere incorporato in una cella - pulsanti "galleggiare". Il meglio che puoi fare è allinearlo con una cella in fase di progettazione. – Jay

+0

Stai provando ad aggiungere un pulsante in modo dinamico? Come sarebbe innescato? E il C# dovrebbe essere in qualche componente aggiuntivo? Sembra un'impostazione complessa e non sono chiaro sul perché vorresti farlo; perché non avere semplicemente un componente aggiuntivo VSTO e un menu o un nastro che rende la funzione disponibile da qualsiasi foglio di lavoro? – Mathias

+0

@Jay: Posso conviverci. Qualche consiglio su come far galleggiare un pulsante sopra il mio foglio di lavoro? @Mathias: Sì, vorrei aggiungere i pulsanti in modo dinamico e i callback C# saranno in un componente aggiuntivo. Lo scopo del mio componente aggiuntivo è quello di aiutare l'utente a creare "moduli" in un foglio di calcolo, e vorrei alcuni dei moduli per incorporare i pulsanti. – mcoolbeth

risposta

10

Con un documento di personalizzazione VSTO (vale a dire, una cartella di lavoro con il codice di Net allegato), è possibile aggiungere e rimuovere i controlli a runtime per i fogli di lavoro del progetto. Il codice seguente illustra l'idea:

public partial class Sheet1 
{ 
    private void Sheet1_Startup(object sender, System.EventArgs e) 
    { 
     var button = this.Controls.AddButton(10, 10, 50, 50, "My Button"); 
     button.Text = "My Button"; 
     button.Click += new EventHandler(button_Click); 
    } 

    void button_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("I was clicked!"); 
    } 

Si potrebbe anche aggiungere controlli in modo dinamico ai documenti tramite un VSTO aggiuntivo, utilizzando il codice in questo senso (grazie alle persone sulla VSTO forum per quello):

var workSheet = (Excel.Worksheet) sheet; 
var vstoSheet = workSheet.GetVstoObject(); 
var button = vstoSheet.Controls.AddButton(50, 50, 100, 50, "Test"); 
button.Text = "Dynamic Button!"; 

Controllare this post by Eric Carter per maggiori informazioni.

0

Ecco il codice che funziona per me in VSTO aggiuntivo (versione modificata della risposta di Mathias):

using Excel = Microsoft.Office.Interop.Excel; 
using ExcelTools = Microsoft.Office.Tools.Excel; 

public void AddButtonToWorksheet() 
{ 
    Excel.Worksheet worksheet = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet; 
    ExcelTools.Worksheet vstoSheet = Globals.Factory.GetVstoObject(worksheet); 

    Button button = new Button(); 
    button.Text = "Dynamic Button!"; 
    vstoSheet.Controls.AddControl(
    button, 50, 50, 100, 50, "TestButton"); 
}