Lattice Grid Buy a licence

developer guide

Data Grid Fill Handle and Series Fill

The fill handle extends a selection by dragging its corner: repeat one value down a column, or continue a run of numbers or dates, with month ends carried across properly rather than by adding thirty days.

Developer guideEditing › Data Grid Fill Handle and Series Fill

Filling a series

Dragging the fill handle continues what it can recognise rather than repeating the block. Detection is per column, so dragging three columns down continues three independent series.

What is recognised

1, 2, 3        // → 4, 5, 6      constant difference, two or more values
5, 10, 15      // → 20, 25       any step, including negative and fractional
2026-01-01 …   // → the next day, week or whatever the gap is
15 Jan, 15 Feb // → 15 Mar        whole months, holding the day of month
31 Jan, 28 Feb // → 31 Mar, 30 Apr  month ends stay on the month end
'x', 'y'       // → x, y, x, y   nothing recognised, so the block repeats
7              // → 7, 7, 7      one value is a copy, not a series

Months step as months. 15 January to 15 February is thirty-one days, and continuing in days would land on 18 March and drift further every step. A month step holds the date the user picked, and clamps where the month is short: 31 January plus a month is 28 February, not 3 March.

Month ends are their own case. 31 Jan, 28 Feb is a month series whose second value has already been clamped, so the two share no day of month and the day-preserving rule cannot see it. Where every source value is the last day of its own month, the fill stays on the month end: 31 March, 30 April, 31 May, and 29 February in a leap year. Values that share a day of month keep the day-preserving answer, so 30 Apr, 30 Jun still gives 30 August rather than the 31st.

One limit worth knowing. Filling upwards is not supported; the handle extends downwards only.

Supplying your own series

selection: {
  fill: ({ source, target, direction }) => target.map((t, i) => nextCode(source, i)),
}

A domain series (order codes, fiscal periods, seat numbers) is not something the grid can infer, so selection.fill takes precedence when you supply it. It must return one value per target row; anything else is ignored in favour of the built-in detection, rather than being partly applied.