# MgGrid — Columns > Part of the MgGrid system. See `README.md` for overview and component hierarchy. ## MgGridDataColumn Extended `DxGridDataColumn` with InfoPanel and URL link support. | Parameter | Type | Default | Description | |---|---|---|---| | `ShowInInfoPanel` | `bool` | `true` | Whether this column is visible in InfoPanel | | `InfoPanelDisplayFormat` | `string?` | `null` | Custom display format for InfoPanel | | `InfoPanelOrder` | `int` | `int.MaxValue` | Column order in InfoPanel (lower = earlier) | | `InfoPanelEditTemplate` | `RenderFragment?` | `null` | Custom InfoPanel editor (edit mode) — takes precedence over the `EditSettings` / property-type default editors | | `UrlLink` | `string?` | `null` | URL template with `{Property}` placeholders | **UrlLink example:** `https://admin.example.com/Entity/Edit/{Id}` — renders cell as ``. ## InfoPanelEditTemplate Use when the grid-side editor is a `CellEditTemplate` the InfoPanel cannot reuse (it is bound to the grid-cell context) — without it, the panel falls back to the property-type default editor (e.g. `int` → number spinner). Context: `MgGridInfoPanelEditContext(object EditModel, Action Refresh)` — call `Refresh()` after mutations other fields depend on (cascading lookups), it re-renders the InfoPanel. ```razor @CategoryEditor((MyItem)context.EditModel) @CategoryEditor((MyItem)context.EditModel, context.Refresh) ``` Define the editor once as a shared fragment (`private RenderFragment CategoryEditor(MyItem item, Action? refresh = null) => @;`) so the grid cell and the InfoPanel render the same component — no duplicated markup. Uses compiled property accessors (`ConcurrentDictionary` cache) for performance.