Selectores
Los selectores canónicos de Dinaup: enum, valores en memoria, búsqueda contra informe remoto y picker en diálogo.
Casi todo lo que el usuario "elige" en Dinaup pasa por uno de estos componentes. La pregunta de fondo siempre es la misma: ¿de dónde salen las opciones? De ahí cuelga todo lo demás. No fuerces un componente equivocado: cada uno está pensado para un origen de datos distinto y mezclarlos te trae problemas de rendimiento o de UX.
Antes de mirar props, decide cuál te toca con la regla de los 3 segundos.
Regla de los 3 segundos
| Lo que tienes | Componente | Por qué |
|---|---|---|
Un enum de C# | DnzEnumDropDown | Las opciones SON el enum. Cero datos, cero query. |
| Una lista corta ya cargada en memoria (impuestos, almacenes, estados) | DnzDataGridDropDown | Le pasas la colección y filtra en cliente. Sin ir al servidor. |
| Buscar/elegir una ficha de un catálogo grande (clientes, productos) | DnzRowSelector | No le pasas datos: consulta un informe remoto con búsqueda y paginación. |
Si la lista cabe en memoria sin sudar (decenas, pocos cientos), DnzDataGridDropDown. Si es un catálogo que crece sin límite y vive en el servidor, DnzRowSelector. El primero te ahorra una consulta; el segundo te evita cargar 10.000 filas en el navegador para elegir una.
Los tres últimos de esta página (DnzDropDown, DnzSearchInput, DnzItemPickerDialog) son piezas de apoyo: el dropdown de datos en su versión cruda, la caja de búsqueda con debounce que monta el selector remoto por dentro, y un picker en diálogo para cuando no quieres un desplegable embebido sino una ventana de selección.
DnzEnumDropDown
Desplegable directo sobre un enum de C#. No le pasas opciones: las saca del propio tipo, y usa el [Display(Name=...)] de cada valor como texto visible si lo tiene.
<DnzEnumDropDown TEnum="EstadoPedidoE" @bind-Value=@estadoPedido Placeholder="Selecciona estado" />@code {
EstadoPedidoE estadoPedido = EstadoPedidoE.Pendiente;
}| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Value | TEnum | Valor seleccionado. Úsalo con @bind-Value. | |
ValueChanged | EventCallback<TEnum> | Se dispara al cambiar la selección (lo cablea @bind-Value). | |
Placeholder | string | "" | Texto cuando no hay nada elegido. |
Disabled | bool | false | Bloquea el control. |
Style | string | "width:200px" | Estilo inline del desplegable, normalmente el ancho. |
Name | string | "" | Nombre del campo (para formularios/validación Radzen). |
El texto de cada opción sale de [Display(Name = "Pendiente de pago")] sobre el valor del enum. Sin el atributo, se muestra el nombre técnico del miembro. Decóralo en la definición del enum y aquí no tocas nada.
DnzDataGridDropDown
Selector para una lista que ya tienes en memoria. Le pasas la colección por Data, le dices qué propiedad pintar con TextProperty, y él monta un desplegable con buscador, columna y acciones (limpiar, abrir ficha, añadir). El tipo T tiene que implementar IDinaupRow.
<DnzDataGridDropDown T="APIImpuestosC.APIImpuestos_RowC" Label="Impuestos" IsRequired=true TextProperty=@nameof(APIImpuestosC.APIImpuestos_RowC.TextoPrincipal) Data=@impuestos.Values @bind-Value=@impuestoSeleccionado @bind-Value:after=@(async () => await Recalcular()) Style="width:100%" />Con color por estado (badge automático) y columnas a medida:
<DnzDataGridDropDown T="EstadoPedidoRow" Label="Estado" TextProperty=@nameof(EstadoPedidoRow.Nombre) ColorProperty=@nameof(EstadoPedidoRow.Color) Data=@estados @bind-Value=@estado />| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Data | IEnumerable<T> | new List<T>() | La colección en memoria a elegir. |
Value | T | Fila seleccionada. Úsalo con @bind-Value. | |
ValueChanged | EventCallback<T> | Se dispara al cambiar la selección. | |
TextProperty | string | Nombre de la propiedad a mostrar. Obligatorio; usa @nameof(...). | |
Label | string | Etiqueta del campo. | |
ColorProperty | string | Propiedad con el estilo de color; pinta la opción como badge. | |
IconoProperty | string | Propiedad que aporta el icono de cada opción. | |
IsRequired | bool | false | Marca visual de obligatorio si no hay valor. |
Disabled | bool | false | Bloquea el control. |
Width | string | "280px" | Ancho del campo. |
Style | string | Estilo inline adicional del campo. | |
Icon | string | Icono al inicio del campo. | |
OpenInWindow | bool | true | Permite abrir la ficha del seleccionado en ventana (necesita Client). |
Client | DinaupClientC | Cliente para abrir la ficha en ventana. | |
OnAdd | EventCallback | Se dispara al pulsar el "+" cuando no hay nada seleccionado. | |
OnRemove | EventCallback<T> | Se dispara al limpiar. Si no lo cableas, limpia el valor solo. | |
OnOpen | EventCallback<T> | Se dispara al pulsar "abrir ficha". | |
Columns | RenderFragment | Columnas custom para el popup (override de la columna por defecto). | |
ValueTemplate | RenderFragment<dynamic> | Plantilla del valor seleccionado mostrado en el campo. | |
IconTemplate | RenderFragment<T> | Plantilla del icono por fila. | |
ColumnWidth | string | "" | Ancho de columna por defecto del desplegable. |
Visible | bool | true | Oculta el componente entero. |
TextProperty es obligatorio. Sin él, el componente pinta un aviso en rojo en vez del desplegable. Pásalo siempre con @nameof(Tipo.Propiedad), nunca como string suelto.
DnzRowSelector
No le pasas Data: le das un ReportId (el informe de la sección) y un Client, y él busca contra el servidor con paginación. Para catálogos grandes —clientes, productos, proveedores— donde cargar todo en memoria no tiene sentido.
<DnzRowSelector Client=@SessionPlay Label="Cliente" ReportId=@EntidadesD._SectionID @bind-SelectedRow=@cliente AdvancedFilter=@filtro OnAdd=@CrearCliente />Hay dos formas de decirle "ya hay algo seleccionado" al cargar, y eligen entre una consulta o ninguna:
Si ya tienes la fila (IDinaupRow), pásala por @bind-SelectedRow y el componente la pinta directa, sin ir al servidor.
<DnzRowSelector Client=@SessionPlay Label="Cliente" ReportId=@EntidadesD._SectionID @bind-SelectedRow=@cliente />Si solo tienes el Guid, usa DefaultID: el componente lanza una consulta al informe para resolver la fila y mostrar su etiqueta. Una query de más, úsalo solo cuando no tengas la fila a mano.
<DnzRowSelector Client=@SessionPlay Label="Cliente" ReportId=@EntidadesD._SectionID DefaultID=@clienteId @bind-SelectedRow=@cliente />| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Client | DinaupClientC | Cliente contra el que consulta el informe. Obligatorio (EditorRequired). | |
ReportId | string | GUID del informe (SeccionD._SectionID) que alimenta la búsqueda. | |
SelectedRow | IDinaupRow | Fila seleccionada. Úsalo con @bind-SelectedRow. | |
SelectedRowChanged | EventCallback<IDinaupRow> | Se dispara al cambiar la selección. | |
DefaultID | Guid | Guid.Empty | ID inicial a resolver (lanza una consulta al informe). |
Label | string | Etiqueta del campo. | |
Placeholder | string | Texto cuando no hay nada elegido. | |
IsRequired | bool | false | Marca visual de obligatorio si está vacío. |
Disabled | bool | false | Bloquea el control. |
AdvancedFilter | List<FilterCondition> | Filtro aplicado al informe (acota el universo buscable). | |
AdminMode | bool | false | Consulta el informe en modo admin. |
Width | string | "280px" | Ancho del campo. |
Style | string | "flex:1" | Estilo inline del campo. |
Class | string | "" | Clases CSS extra del contenedor. |
Icon | string | Icono al inicio del campo. | |
KeyboardShortcut | string | Atajo de teclado asociado al selector. | |
OpenInWindow | bool | true | Permite abrir la ficha seleccionada en ventana. |
OnAdd | EventCallback<Guid> | Se dispara al pulsar el "+" para crear una ficha nueva. | |
OnOpenRecord | EventCallback<IDinaupRow> | Se dispara al pulsar "abrir"; si no lo cableas, abre la ficha en ventana. |
AdvancedFilter es tu palanca para acotar: pásale un List<FilterCondition> y el usuario solo busca dentro de ese subconjunto (ej. clientes activos, productos de un almacén). Combínalo con OnAdd para que pueda crear sobre la marcha si no encuentra lo que busca.
Además del binding, DnzRowSelector expone métodos públicos para preseleccionar desde código: SelectByIdAsync(Guid id) resuelve la fila por id contra el informe, y SelectAsync(...) acepta una fila (IDinaupRow), una DinaupBasicInformation o incluso otro DnzRowSelector como origen.
DnzDropDown
La versión cruda del desplegable de datos sobre IDinaupRow, sin la capa de overlay de acciones ni resolución de color/icono de DnzDataGridDropDown. En la práctica usa DnzDataGridDropDown; este queda para casos donde quieras el grid pelado. Igual que aquel, TextProperty es obligatorio.
<DnzDropDown T="APIAlmacenes_RowC" Label="Almacén" TextProperty=@nameof(APIAlmacenes_RowC.TextoPrincipal) Data=@almacenes.Values @bind-Selected=@almacenSeleccionado />| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Data | IEnumerable<T> | new List<T>() | La colección a elegir. |
Selected | T | Fila seleccionada. Úsalo con @bind-Selected. | |
SelectedChanged | EventCallback<T> | Se dispara al cambiar la selección. | |
TextProperty | string | Propiedad a mostrar. Obligatorio; usa @nameof(...). | |
ColorProperty | string | Propiedad de estilo de color de cada opción. | |
IconoProperty | string | Propiedad que aporta el icono de cada opción. | |
Label | string | Etiqueta del campo. | |
Icon | string | Icono al inicio del campo. | |
Style | string | Estilo inline del control. | |
Class | string | Clases CSS extra. | |
Disabled | bool | false | Bloquea el control. |
Visible | bool | true | Oculta el componente entero. |
OnAdd | EventCallback | Se dispara al pulsar el "+". | |
OnRemove | EventCallback<T> | Se dispara al limpiar; si no lo cableas, limpia solo. | |
OnOpen | EventCallback<T> | Se dispara al pulsar "abrir ficha". |
DnzSearchInput
Caja de búsqueda con icono de lupa y debounce de 500 ms. No es un selector: es la pieza que dispara el filtro sin lanzar una consulta por cada tecla. La usa por dentro DnzRowSelector para buscar contra el informe, y te sirve para tu propio buscador sobre una lista o un informe.
<DnzSearchInput Placeholder="Buscar producto..." BounceValueChanged=@OnBuscar Class="w-100" />@code {
async Task OnBuscar(string texto) {
await CargarResultados(texto);
}
}| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
BounceValueChanged | EventCallback<string> | Se dispara 500 ms después de que el usuario deja de teclear, con el texto actual. | |
Value | string | Texto del campo. | |
Placeholder | string | "Buscar..." | Texto cuando está vacío. |
Class | string | "" | Clases CSS extra para el contenedor. |
Style | string | "" | Estilo inline del contenedor. |
El debounce es de 500 ms y va por dentro con el Debouncer de Dinaup. No montes tu propio temporizador encima: engancha tu carga a BounceValueChanged y listo.
DnzItemPickerDialog
Cuando no quieres un desplegable embebido sino abrir una ventana de selección a pantalla completa sobre un informe. Lo lanzas con OpenAsync y te devuelve la fila elegida (o null si el usuario cierra).
@inject DialogService DialogService
@code {
async Task ElegirCliente() {
var fila = await DnzItemPickerDialog.OpenAsync(DialogService, SessionPlay, EntidadesD._SectionID);
if (fila.IsNotNull()) clienteSeleccionado = fila;
}
}| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Client | DinaupClientC | Cliente contra el que consulta el informe. | |
ReportId | string | GUID del informe que se muestra en el diálogo. |
El método estático OpenAsync(DialogService, DinaupClientC, string reportId) abre el diálogo (800×600, redimensionable y arrastrable) y devuelve un DinaupDynamicRowDTO con la fila seleccionada, o null si se cancela.
Para elegir una ficha dentro de un formulario, casi siempre prefieres DnzRowSelector embebido. Reserva este diálogo para cuando la selección es una acción aparte (un botón "Elegir cliente…" que abre la ventana) y no un campo más del layout.
Relacionado: Introducción a DinaZen · Índice de componentes · Informes (Flex) · Cliente Dinaup · Guías de estilo C#/Blazor
KPIs y métricas
Tarjetas, tiras y filas de indicadores para montar dashboards: cifras destacadas, tendencias con color, comparativas de tiempo y resúmenes de informe.
Tablas e informes
El puente entre el SDK y la UI: ejecutas un informe de Dinaup Flex y repartes sus filas a tabla, tarjetas, gráfica o ranking, con filtros incluidos.