Code Behind a Document
VSTO supports code behind a document by requiring that the developer use classes generated in a VSTO project that have pre-hooked-up context and pre-hooked-up events. These classes are sometimes called "code behind" classes because they are code associated with a particular document or worksheet. In Word, there is one code behind class corresponding to the document. In Excel, there are multiple code behind classesone for the workbook and one for each worksheet or chart sheet in the workbook.The first time your code runs in a VSTO code behind the document project is when Office raises the Startup event handled by any of the code behind classes created for you. VSTO provides context via the base class of the code behind class you are writing code in. A VSTO code behind class customizing an Excel worksheet derives from a base class that contains all the methods, properties, and events of an Excel worksheet. This enables you to write code such as this in the Startup method of a worksheet class.
By using this.Name, you are referring to the Name property of the Excel Worksheet object inherited from the base class. Listing 2-6 shows a VSTO code behind class for an Excel Worksheet. In addition to the Startup and Shutdown methods in the code behind class, there is also a generated method called InternalStartup. You should not put any of your code in this InternalStartup method because it is auto-generated by VSTO and modifying it can break Visual Studio's support for code behind classes. Instead, your startup code should go in the Startup event handler. VSTO code behind document classes also use partial classes to hide some additional code generated by VSTO.
MessageBox.Show(String.Format("{0} is the sheet name", this.Name));
Listing 2-6. A VSTO Excel Workbook Customization
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
namespace ExcelWorkbook1
{
public partial class Sheet1
{
private void Sheet1_Startup(object sender, EventArgs e)
{
// Initial entry point.
// This code gets run first when the code behind is created
// The context is implicit in the Sheet1 class
MessageBox.Show("Code behind the document running.");
MessageBox.Show(String.Format("{0} is the sheet name",
this.Name));
}
private void Sheet1_Shutdown(object sender, EventArgs e)
{
}
#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(Sheet1_Startup);
this.Shutdown += new System.EventHandler(Sheet1_Shutdown);
}
#endregion
}
}
VSTO Code Behind a Document in Excel
In this section, we create some simple code behind a document in Excel using VSTO. First, start up VSTO and choose the File > New > Project menu item. As you have seen previously, navigate to the Office node under the Visual C# root.We will create an Excel workbook project using C#. If you already have a workbook that you want to add VSTO customization code behind, you can specify its location in the dialog box shown in Figure 2-8 that appears after you click OK in the New Project dialog. This time we will just start from scratch, creating a new, blank workbook.
Figure 2-8. Selecting the workbook to associate with your code behind.

Figure 2-7. Using the New Project dialog to create an Excel Workbook project.
[View full size image]

Figure 2-9. The design view for VSTO Excel code behind.
[View full size image]

Figure 2-10. The merging of Visual Studio and Excel menus.

Figure 2-11. Creating a ListObject in the designer.
[View full size image]

Listing 2-7. A VSTO Customization That Adds a Control to the Document Actions Task Pane and Data Binds a ListObject Control to a DataTable
Build and run the code, and sure enough Excel starts up, the Startup event is raised for the sheet, and the button is added to the actions pane. Click the button and a random DataTable is generated and bound to the list object, as shown in Figure 2-12. Exit Excel to end your debugging session.
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
namespace ExcelWorkbook1
{
public partial class Sheet1
{
Button myButton = new Button();
DataTable table;
private void Sheet1_Startup(object sender, EventArgs e)
{
myButton.Text = "Databind!";
myButton.Click += new EventHandler(myButton_Click);
Globals.ThisWorkbook.ActionsPane.Controls.Add(myButton);
}
void myButton_Click(object sender, EventArgs e)
{
List1.DataSource = null;
table = new DataTable();
Random r = new Random();
for (int i = 0; i < 4; i++)
table.Columns.Add("Col " + i.ToString());
for (int i = 0; i < 20; i++)
table.Rows.Add(r.NextDouble(), r.NextDouble(),
r.NextDouble(), r.NextDouble());
List1.DataSource = table;
}
private void Sheet1_Shutdown(object sender, EventArgs e)
{
}
#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(Sheet1_Startup);
this.Shutdown += new System.EventHandler(Sheet1_Shutdown);
}
#endregion
}
}
Figure 2-12. The result of running Listing 2-7 and clicking the button we added to the Document Actions task pane.
Chapter 15, "Working with Actions Pane." For more information on VSTO's support for data binding, see Chapter 17, "VSTO Data Programming."