Dela via


Genomgång: Lägg till kontroller i ett kalkylblad under körning i VSTO-tilläggsprojekt

Du kan lägga till kontroller i alla öppna kalkylblad med hjälp av ett Excel VSTO-tillägg. Den här genomgången visar hur du använder menyfliksområdet för att göra det möjligt för användare att lägga till en Button, en NamedRange, och en ListObject i ett kalkylblad. Mer information finns under Lägga till kontroller i Office-dokument vid körning.

Gäller för: Informationen i det här avsnittet gäller för VSTO-tilläggsprojekt för Excel. Mer information finns i Funktioner som är tillgängliga efter Office-program och projekttyp.

I den här genomgången tas följande aktiviteter upp:

  • Tillhandahålla ett användargränssnitt (UI) för att lägga till kontroller i kalkylbladet.

  • Lägga till kontroller i kalkylbladet.

  • Ta bort kontroller från kalkylbladet.

    Anmärkning

    Datorn kan visa olika namn eller platser för vissa av Visual Studio-användargränssnittselementen i följande instruktioner. Den Visual Studio-utgåva som du har och de inställningar som du använder avgör dessa element. Mer information finns i Anpassa IDE.

Förutsättningar

Du behöver följande komponenter för att slutföra den här genomgången:

Skapa ett nytt Excel VSTO-tilläggsprojekt

Börja med att skapa ett Excel VSTO-tilläggsprojekt.

Skapa ett nytt Excel VSTO-tilläggsprojekt

  1. I Visual Studio skapar du ett Excel VSTO-tilläggsprojekt med namnet ExcelDynamicControls. Mer information finns i Så här skapar du Office-projekt i Visual Studio.

  2. Lägg till en referens till sammansättningen Microsoft.Office.Tools.Excel.v4.0.Utilities.dll . Den här referensen krävs för att programmässigt lägga till en Windows Forms-kontroll i ett kalkylblad senare i den här genomgången.

Ange ett användargränssnitt för att lägga till kontroller i ett kalkylblad

Lägg till en anpassad flik i menyfliksområdet i Excel. Användare kan markera kryssrutor på fliken för att lägga till kontroller i ett kalkylblad.

Så här anger du ett användargränssnitt för att lägga till kontroller i ett kalkylblad

  1. Projekt-menyn klickar du på Lägg till nytt objekt.

  2. I dialogrutan Lägg till nytt objekt väljer du Menyfliksområde (Visual Designer) och klickar sedan på Lägg till.

    En fil med namnet Ribbon1.cs eller Ribbon1.vb öppnas i menyfliksdesignern och visar en standardflik och grupp.

  3. Dra kontrollen Kryssruta till grupp1 på fliken Kontroller i office-menyfliksområdet i verktygslådan.

  4. Klicka på Kryssruta1 för att markera den.

  5. Ändra följande egenskaper i fönstret Egenskaper .

    Fastighet Värde
    Namn knapp
    Etikett knapp
  6. Lägg till en andra kryssruta i group1 och ändra sedan följande egenskaper.

    Fastighet Värde
    Namn NamedRange
    Etikett NamedRange
  7. Lägg till en tredje kryssruta i group1 och ändra sedan följande egenskaper.

    Fastighet Värde
    Namn ListObject
    Etikett ListObject

Lägga till kontroller i kalkylbladet

Hanterade kontroller kan bara läggas till i värdobjekt, som fungerar som containrar. Eftersom VSTO-tilläggsprojekt fungerar med en öppen arbetsbok konverterar VSTO-tillägget kalkylbladet till ett värdobjekt eller hämtar ett befintligt värdobjekt innan kontrollen läggs till. Lägg till kod i klickhändelsehanterare för varje kontroll för att generera ett Worksheet värdobjekt som baseras på det öppna kalkylbladet. Lägg sedan till en Button, en NamedRangeoch en ListObject vid den aktuella markeringen i kalkylbladet.

Lägga till kontroller i ett kalkylblad

  1. Dubbelklicka på Knapp i menyfliksdesignern.

    Kryssrutan Click Händelsehanterare för knappen öppnas i kodredigeraren.

  2. Button_Click Ersätt händelsehanteraren med följande kod.

    Den här koden använder GetVstoObject metoden för att hämta ett värdobjekt som representerar det första kalkylbladet i arbetsboken och lägger sedan till en Button kontroll i den markerade cellen.

    private void Button_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        
        string buttonName = "MyButton";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                Microsoft.Office.Tools.Excel.Controls.Button button =
                    new Microsoft.Office.Tools.Excel.Controls.Button();
                worksheet.Controls.AddControl(button, selection, buttonName);
            }
        }
        else
        {
            worksheet.Controls.Remove(buttonName);
        }
    }
    
  3. I Solution Explorer väljer du Ribbon1.cs eller Ribbon1.vb.

  4. På menyn Visa klickar du på Designer.

  5. Dubbelklicka på NamedRange i menyfliksområdets designer.

  6. NamedRange_Click Ersätt händelsehanteraren med följande kod.

    Den här koden använder GetVstoObject metoden för att hämta ett värdobjekt som representerar det första kalkylbladet i arbetsboken och definierar sedan en NamedRange kontroll för den markerade cellen eller cellerna.

    private void NamedRange_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        string Name = "MyNamedRange";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddNamedRange(selection, Name);
            }
        }
        else
        {
            worksheet.Controls.Remove(Name);
        }
    }
    
  7. Dubbelklicka på ListObject i menyfliksområdets designer.

  8. ListObject_Click Ersätt händelsehanteraren med följande kod.

    Den här koden använder GetVstoObject metoden för att hämta ett värdobjekt som representerar det första kalkylbladet i arbetsboken och definierar sedan en ListObject för den markerade cellen eller cellerna.

    private void ListObject_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        string listObjectName = "MyListObject";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddListObject(selection, listObjectName);
            }
        }
        else
        {
            worksheet.Controls.Remove(listObjectName);
        }
    }
    
  9. Lägg till följande instruktioner överst i bandkodsfilen.

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

Ta bort kontroller från kalkylbladet

Kontroller sparas inte när kalkylbladet sparas och stängs. Du bör programmatiskt ta bort alla genererade Windows Forms-kontroller innan kalkylbladet sparas, eller så visas bara en kontur av kontrollen när arbetsboken öppnas igen. Lägg till kod till händelsen WorkbookBeforeSave som tar bort Windows Forms-kontroller från kontrollsamlingen för det genererade värdobjektet. Mer information finns i Spara dynamiska kontroller i Office-dokument.

Ta bort kontroller från kalkylbladet

  1. I Solution Explorer väljer du ThisAddIn.cs eller ThisAddIn.vb.

  2. På menyn Visa klickar du på Kod.

  3. Lägg till följande metod i ThisAddIn klassen. Den här koden hämtar det första kalkylbladet i arbetsboken och använder HasVstoObject sedan metoden för att kontrollera om kalkylbladet har ett genererat kalkylbladsobjekt. Om det genererade kalkylbladsobjektet har kontroller hämtar koden kalkylbladsobjektet och itererar genom kontrollsamlingen och tar bort kontrollerna.

           void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook, 
               bool SaveAsUI, ref bool Cancel)
           {
               Excel.Worksheet worksheet =
                   workbook.Worksheets[1] as Excel.Worksheet;
               
               if (Globals.Factory.HasVstoObject(worksheet) && 
                   Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0)
               {
                   Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet);
               
              
                   
                   while (vstoWorksheet.Controls.Count > 0)
                   {
                       object vstoControl = vstoWorksheet.Controls[0];
                       vstoWorksheet.Controls.Remove(vstoControl);
                   }
    
               }
           }
    
  4. I C# måste du skapa en händelsehanterare för WorkbookBeforeSave händelsen. Du kan placera den här koden i ThisAddIn_Startup -metoden. Mer information om hur du skapar händelsehanterare finns i Så här skapar du händelsehanterare i Office-projekt. ThisAddIn_Startup Ersätt metoden med följande kod.

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.WorkbookBeforeSave += 
            new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler
                (Application_WorkbookBeforeSave);
    }
    

Testa lösningen

Lägg till kontroller i ett kalkylblad genom att välja dem från en anpassad flik i menyfliksområdet. När du sparar kalkylbladet tas dessa kontroller bort.

Testa lösningen.

  1. Tryck på F5 för att köra projektet.

  2. Markera valfri cell i Blad1.

  3. Klicka på fliken Tillägg .

  4. I gruppen group1 klickar du på Knapp.

    En knapp visas i den markerade cellen.

  5. Markera en annan cell i Blad1.

  6. I gruppen group1 klickar du på NamedRange.

    Ett namngivet område definieras för den valda cellen.

  7. Markera en serie celler i Blad1.

  8. I gruppen group1 klickar du på ListObject.

    Ett listobjekt läggs till för de markerade cellerna.

  9. Spara kalkylbladet.

    De kontroller som du har lagt till i Sheet1 visas inte längre.

Nästa steg

Du kan läsa mer om kontroller i Excel VSTO-tilläggsprojekt i det här avsnittet: