# Customized Grid Editors

## Content

The following sections describe how to use and create custom grid editors.

## Using Custom Editors

The built-in editors provide a lot of flexibility and power, but in some cases you may want to use external controls as specialized editors. For example, you may want to use the **C1NumericEdit** control that provides a drop-down calculator for entering numbers, or an editor for selecting from multi-column lists, or a specialized control that you wrote to edit your business objects.

>type=note
> **Note**: The **C1NumericEdit** control is one of the **Input for WinForms** controls. For more information on the **C1NumericEdit** control, please refer to the **Input for WinForms** documentation available on the [website](https://developer.mescius.com/componentone/docs/win).

Any control that derives from the base **Control** class can be used as a basic grid editor. Controls that implement the **IC1EmbeddedEditor** interface can provide better integration with the grid and more advanced features. For details on the **IC1EmbeddedEditor** interface, see the [Editor](/componentone/docs/win/online-truedbgrid/) property.

To use a control as a custom editor, all you have to do is associate an instance of the control with a grid column using the **Editor** property. You can do this in code using the Editor property. After that, the control will be automatically used by the grid.

For example, to use a **C1NumericEdit** control as a grid editor, follow these steps:

1. Add a [C1TrueDBGrid](/componentone/docs/win/online-truedbgrid/) control and a **C1NumericInput** control to the form.
2. For the **C1NumericInput** control, set the **BorderStyle** property to **None** and the **Visible** property to **False** either in the Properties window or by adding the following code to the **Form\_Load** event:

    ```csharp
    // Set up the custom editor.
    this.c1NumericEdit1.BorderStyle = BorderStyle.None;
    this.c1NumericEdit1.Visible = false;
    ```
3. In the **Form\_Load** event assign the custom editor to the grid column.

    ```csharp
    private void Form_Load(object sender, EventArgs e)
    {
        // Assign the custom editor to the grid.
        this.c1TrueDBGrid1.Columns[0].Editor = this.c1NumericEdit1;
    }
    ```

Run the project and edit some values in the first column. Notice how the grid positions and initializes the **C1NumericEdit** control so you can edit cell values. When you are done editing a cell, click a different cell or press the TAB key to move to the next one. Notice how the new value is applied to the cell.

## Creating Custom Editors

Any control that derives from the **Control** base class can be used as a grid editor. This is possible because the grid knows enough about the base class to access properties such as **Text** and **Bounds**, and events such as **Leave** and **TextChanged**. In many cases this level of support is adequate.

In some cases, however, you may want to use controls that do not follow the base class that closely. For example, a **DateTimePicker** control has a **Value** property that should be used to retrieve the edited value instead of **Text**. In these cases, you can implement one or more methods in the **IC1EmbeddedEditor** interface to override the default behavior. For example, all controls in the C1Input library support **IC1EmbeddedEditor** and therefore integrate closely with [C1TrueDBGrid](/componentone/docs/win/online-truedbgrid/) (and also **C1FlexGrid**).

The **IC1EmbeddedEditor** interface is fairly simple, and because the grid binds to it using late binding, you do not even have to implement all its members. Only implement the ones that make sense to your editor control.

The interface does provide enough flexibility to allow virtually any control to be used as a grid editor. You can even use **UITypeEditor** classes as grid editors. To do this, you need a wrapper class that:

1. Derives from **Control** (**UITypeEditor** does not).
2. Implements the **IC1EmbeddedEditor** interface.
3. Encapsulates the appropriate **UITypeEditor**.

>type=note
> **Note**: For a complete sample using this wrapper class, see the **CustomEditors** sample installed with **Winforms Edition**.

Using the **UITypeEditor** wrapper class, you can use any **UITypeEditors** with the **C1TrueDBGrid**. .NET provides several **UITypeEditors** for editing colors, fonts, file names, and so on. You can also write your own **UITypeEditors**, in some cases that is easier than writing a control.

