# dotNet.ReoGrid 扩展库 - 下拉列表单元格

创建下拉列表单元格
-----------------------------------------

要创建下拉列表单元格，可以使用 `DropdownListCell` 类，这是一个内置的单元格类型，用于在指定单元格中显示下拉列表。

```aardio
var sheet1 = grid.CurrentWorksheet;
var dropdown = ReoGrid.CellTypes.DropdownListCell(
  "Apple", "Orange", "Banana", "Pear", "Pumpkin", "Cherry", "Coconut"
);
sheet1["B2"] = dropdown;
```

效果: ![196](../images/196.png)

修改列表项
-------------------------

使用 `Items` 属性可以添加、删除和清空列表项：

```aardio
dropdown.Items.AddRange("Apple", "Orange", "Banana", "Pear", "Pumpkin", "Cherry", "Coconut");
```

设置默认数据
-----------------------------

要设置默认数据或更改单元格数据，可以直接设置单元格的数据：

```aardio
sheet1["B2"] = "Apple";
```

效果: ![197](../images/197.png)

获取选中数据
-----------------------------

可以通过以下两种方式获取用户选择项的事件：

* 使用 `DropdownListCell` 实例的 `SelectedItemChanged` 事件
* 使用 `Worksheet` 实例的 `CellDataChanged` 事件

使用 `SelectedItemChanged` 事件的代码：

```aardio
dropdown.SelectedItemChanged = function(sender,event){ 
    /* 处理选中项变更 */
};
```

由于下拉列表单元格会在用户选择后更新单元格数据，也可以使用 `CellDataChanged` 事件来获取选中数据：

```aardio
sheet1.CellDataChanged = function(sender,event){
    if(event.Cell.Position == "E5"){ 
        winform.msgbox("下拉列表选中项: " + event.Cell.Data);
    }
};
```

更改下拉单元格大小
-----------------------------------------

有多种方法可以更改下拉单元格的宽度，根据工作表布局选择以下方法之一：

1. 更改表头（包含该单元格的行或列）的大小
2. 将下拉单元格与相邻单元格合并
3. 为单元格设置 `Padding` 样式

### 更改表头大小

使用 `SetColumnsWidth` 和 `SetRowsHeight` 方法设置表头大小也会改变单元格大小：

```aardio
sheet1.ColumnHeaders["B"].Width = 120;
```

效果: ![198](../images/198.png)

更改行高：

```aardio
sheet1.RowHeaders[1].Height = 40;
```

效果: ![199-2](../images/199-2.png)

### 合并单元格

通过合并相邻单元格来增大尺寸：

```aardio
sheet1.MergeRange("B2:C2");
```

效果: ![200](../images/200.png)

### 设置内边距样式

为单元格设置内边距样式可以缩小下拉控件在单元格内的显示区域：

```aardio
// 设置右侧内边距 10 像素，ReoGrid.PaddingValue 参数依次为(上,下,左,右)
header.Style.Padding =  ReoGrid.PaddingValue(0,0,0,10/*right*/);
```

效果: ![201](../images/201.png)

更改下拉按钮大小
-------------------------------------

以下两个属性与更改按钮大小相关：

* `DropdownButtonAutoHeight`
* `DropdownButtonSize`

`DropdownButtonAutoHeight` 属性表示自动调整下拉按钮高度以适应单元格，默认值为 true；`DropdownButtonSize` 属性用于直接设置下拉按钮大小。当 `DropdownButtonAutoHeight` 为 true 时，按钮高度设置将不起作用。

自动高度为 true 时: ![199-2](../images/199-2.png)

自动高度为 false 时: ![199](../images/199.png)

当 `DropdownButtonAutoHeight` 为 false 时，可以修改 `DropdownButtonSize` 属性来调整按钮大小：

```aardio
dropdown.DropdownButtonAutoHeight = false;
dropdown.DropdownButtonSize = grid.Size(40, 15);
```

效果: ![202](../images/202.png)

设置单元格边框
---------------------------------

下拉单元格本身不显示边框，需要通过设置单元格边框样式来显示：

```aardio
sheet1.Ranges["B2"].BorderOutside = ReoGrid.Graphics.SolidColor.Gray;
```

效果: ![205](../images/205.png)

绘制自定义下拉按钮
-----------------------------------------

下面演示在 aardio 中调用 C# 代码编译一个继承自 `ReoGrid.CellTypes.DropdownListCell` 的 .NET 类，
并重写 `OnPaintDropdownButton` 方法绘制自定义下拉按钮：

```aardio
import win.ui;
/*DSG{{*/
var winform = win.form(text="ReoGrid - 自定义单元格")
/*}}*/

import dotNet.ReoGrid; 
var grid = ReoGrid.ReoGridControl(winform);
var sheet1 = grid.CurrentWorksheet;
 
import dotNet.ReoGrid.Compiler;
var compiler = dotNet.ReoGrid.Compiler();

//C# 源代码
compiler.Source = /***
using System;
using unvell.ReoGrid;
using unvell.ReoGrid.CellTypes;
using unvell.ReoGrid.Events;
using unvell.ReoGrid.Rendering;
using unvell.ReoGrid.Graphics;
using unvell.ReoGrid.Interaction;
using unvell.Common;

namespace aardio.ReoGrid {
    public class MyDropdownListCell : DropdownListCell {
        public MyDropdownListCell(params string[] items) : base(items) { }
        
        protected override void OnPaintDropdownButton(CellDrawingContext dc,Rectangle buttonRect) {
            dc.Graphics.DrawAndFillRectangle(buttonRect, 
                SolidColor.DeepSkyBlue, 
                new SolidColor("#BEE7F1"));
                
            var centerPoint = new Point(
                buttonRect.Left + buttonRect.Width / 2,
                buttonRect.Top + buttonRect.Height / 2);
                
            //绘制下拉按钮
            var triangleSize = 5;
            var points = new Point[] {
                new Point(centerPoint.X - triangleSize, centerPoint.Y - triangleSize / 2),
                new Point(centerPoint.X + triangleSize, centerPoint.Y - triangleSize / 2),
                new Point(centerPoint.X, centerPoint.Y + triangleSize / 2)
            };

            dc.Graphics.FillPolygon(new SolidColor(this.IsDropdown ? "#0078D7" : "#666666"), points);
        }
    }
}
***/

//编译 C# 代码并生成程序集
compiler.CompileOrFail("/MyCheckBox.dll");

//加载程序集
var dll = dotNet.loadFile("/MyCheckBox.dll");

//在 aardio 中创建 .NET 对象
var MyDropdownListCell = dll.import("aardio.ReoGrid.MyDropdownListCell");

//加载到单元格
sheet1["C1"] = MyDropdownListCell( ["Item1", "Item2"] );
 
winform.show();
win.loopMessage();
```

效果: ![203](../images/203.png)

请参考：[自定义单元格](custom-cell.html)

创建自定义下拉单元格
---------------------------------------------

可以创建自定义下拉单元格，将任何 Windows 窗体控件放入下拉面板中。

![166](../images/166.png)

参考[如何创建自定义下拉单元格](../how-to/create-custom-drop-down-cell.html)。