aardio 文档

dotNet.ReoGrid 扩展库 - 下拉列表单元格

创建下拉列表单元格

要创建下拉列表单元格,可以使用 DropdownListCell 类,这是一个内置的单元格类型,用于在指定单元格中显示下拉列表。

var sheet1 = grid.CurrentWorksheet;
var dropdown = ReoGrid.CellTypes.DropdownListCell(
  "Apple", "Orange", "Banana", "Pear", "Pumpkin", "Cherry", "Coconut"
);
sheet1["B2"] = dropdown;

效果: 196

修改列表项

使用 Items 属性可以添加、删除和清空列表项:

dropdown.Items.AddRange("Apple", "Orange", "Banana", "Pear", "Pumpkin", "Cherry", "Coconut");

设置默认数据

要设置默认数据或更改单元格数据,可以直接设置单元格的数据:

sheet1["B2"] = "Apple";

效果: 197

获取选中数据

可以通过以下两种方式获取用户选择项的事件:

使用 SelectedItemChanged 事件的代码:

dropdown.SelectedItemChanged = function(sender,event){ 
    /* 处理选中项变更 */
};

由于下拉列表单元格会在用户选择后更新单元格数据,也可以使用 CellDataChanged 事件来获取选中数据:

sheet1.CellDataChanged = function(sender,event){
    if(event.Cell.Position == "E5"){ 
        winform.msgbox("下拉列表选中项: " + event.Cell.Data);
    }
};

更改下拉单元格大小

有多种方法可以更改下拉单元格的宽度,根据工作表布局选择以下方法之一:

  1. 更改表头(包含该单元格的行或列)的大小
  2. 将下拉单元格与相邻单元格合并
  3. 为单元格设置 Padding 样式

更改表头大小

使用 SetColumnsWidthSetRowsHeight 方法设置表头大小也会改变单元格大小:

sheet1.ColumnHeaders["B"].Width = 120;

效果: 198

更改行高:

sheet1.RowHeaders[1].Height = 40;

效果: 199-2

合并单元格

通过合并相邻单元格来增大尺寸:

sheet1.MergeRange("B2:C2");

效果: 200

设置内边距样式

为单元格设置内边距样式可以缩小下拉控件在单元格内的显示区域:

// 设置右侧内边距 10 像素,ReoGrid.PaddingValue 参数依次为(上,下,左,右)
header.Style.Padding =  ReoGrid.PaddingValue(0,0,0,10/*right*/);

效果: 201

更改下拉按钮大小

以下两个属性与更改按钮大小相关:

DropdownButtonAutoHeight 属性表示自动调整下拉按钮高度以适应单元格,默认值为 true;DropdownButtonSize 属性用于直接设置下拉按钮大小。当 DropdownButtonAutoHeight 为 true 时,按钮高度设置将不起作用。

自动高度为 true 时: 199-2

自动高度为 false 时: 199

DropdownButtonAutoHeight 为 false 时,可以修改 DropdownButtonSize 属性来调整按钮大小:

dropdown.DropdownButtonAutoHeight = false;
dropdown.DropdownButtonSize = grid.Size(40, 15);

效果: 202

设置单元格边框

下拉单元格本身不显示边框,需要通过设置单元格边框样式来显示:

sheet1.Ranges["B2"].BorderOutside = ReoGrid.Graphics.SolidColor.Gray;

效果: 205

绘制自定义下拉按钮

下面演示在 aardio 中调用 C# 代码编译一个继承自 ReoGrid.CellTypes.DropdownListCell 的 .NET 类, 并重写 OnPaintDropdownButton 方法绘制自定义下拉按钮:

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

请参考:自定义单元格

创建自定义下拉单元格

可以创建自定义下拉单元格,将任何 Windows 窗体控件放入下拉面板中。

166

参考如何创建自定义下拉单元格

Markdown 格式