Esta documentación está en fase de desarrollo y puede contener errores.

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 tienesComponentePor qué
Un enum de C#DnzEnumDropDownLas opciones SON el enum. Cero datos, cero query.
Una lista corta ya cargada en memoria (impuestos, almacenes, estados)DnzDataGridDropDownLe pasas la colección y filtra en cliente. Sin ir al servidor.
Buscar/elegir una ficha de un catálogo grande (clientes, productos)DnzRowSelectorNo 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ámetroTipoDefaultPara qué
ValueTEnumValor seleccionado. Úsalo con @bind-Value.
ValueChangedEventCallback<TEnum>Se dispara al cambiar la selección (lo cablea @bind-Value).
Placeholderstring""Texto cuando no hay nada elegido.
DisabledboolfalseBloquea el control.
Stylestring"width:200px"Estilo inline del desplegable, normalmente el ancho.
Namestring""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ámetroTipoDefaultPara qué
DataIEnumerable<T>new List<T>()La colección en memoria a elegir.
ValueTFila seleccionada. Úsalo con @bind-Value.
ValueChangedEventCallback<T>Se dispara al cambiar la selección.
TextPropertystringNombre de la propiedad a mostrar. Obligatorio; usa @nameof(...).
LabelstringEtiqueta del campo.
ColorPropertystringPropiedad con el estilo de color; pinta la opción como badge.
IconoPropertystringPropiedad que aporta el icono de cada opción.
IsRequiredboolfalseMarca visual de obligatorio si no hay valor.
DisabledboolfalseBloquea el control.
Widthstring"280px"Ancho del campo.
StylestringEstilo inline adicional del campo.
IconstringIcono al inicio del campo.
OpenInWindowbooltruePermite abrir la ficha del seleccionado en ventana (necesita Client).
ClientDinaupClientCCliente para abrir la ficha en ventana.
OnAddEventCallbackSe dispara al pulsar el "+" cuando no hay nada seleccionado.
OnRemoveEventCallback<T>Se dispara al limpiar. Si no lo cableas, limpia el valor solo.
OnOpenEventCallback<T>Se dispara al pulsar "abrir ficha".
ColumnsRenderFragmentColumnas custom para el popup (override de la columna por defecto).
ValueTemplateRenderFragment<dynamic>Plantilla del valor seleccionado mostrado en el campo.
IconTemplateRenderFragment<T>Plantilla del icono por fila.
ColumnWidthstring""Ancho de columna por defecto del desplegable.
VisiblebooltrueOculta 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ámetroTipoDefaultPara qué
ClientDinaupClientCCliente contra el que consulta el informe. Obligatorio (EditorRequired).
ReportIdstringGUID del informe (SeccionD._SectionID) que alimenta la búsqueda.
SelectedRowIDinaupRowFila seleccionada. Úsalo con @bind-SelectedRow.
SelectedRowChangedEventCallback<IDinaupRow>Se dispara al cambiar la selección.
DefaultIDGuidGuid.EmptyID inicial a resolver (lanza una consulta al informe).
LabelstringEtiqueta del campo.
PlaceholderstringTexto cuando no hay nada elegido.
IsRequiredboolfalseMarca visual de obligatorio si está vacío.
DisabledboolfalseBloquea el control.
AdvancedFilterList<FilterCondition>Filtro aplicado al informe (acota el universo buscable).
AdminModeboolfalseConsulta el informe en modo admin.
Widthstring"280px"Ancho del campo.
Stylestring"flex:1"Estilo inline del campo.
Classstring""Clases CSS extra del contenedor.
IconstringIcono al inicio del campo.
KeyboardShortcutstringAtajo de teclado asociado al selector.
OpenInWindowbooltruePermite abrir la ficha seleccionada en ventana.
OnAddEventCallback<Guid>Se dispara al pulsar el "+" para crear una ficha nueva.
OnOpenRecordEventCallback<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ámetroTipoDefaultPara qué
DataIEnumerable<T>new List<T>()La colección a elegir.
SelectedTFila seleccionada. Úsalo con @bind-Selected.
SelectedChangedEventCallback<T>Se dispara al cambiar la selección.
TextPropertystringPropiedad a mostrar. Obligatorio; usa @nameof(...).
ColorPropertystringPropiedad de estilo de color de cada opción.
IconoPropertystringPropiedad que aporta el icono de cada opción.
LabelstringEtiqueta del campo.
IconstringIcono al inicio del campo.
StylestringEstilo inline del control.
ClassstringClases CSS extra.
DisabledboolfalseBloquea el control.
VisiblebooltrueOculta el componente entero.
OnAddEventCallbackSe dispara al pulsar el "+".
OnRemoveEventCallback<T>Se dispara al limpiar; si no lo cableas, limpia solo.
OnOpenEventCallback<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ámetroTipoDefaultPara qué
BounceValueChangedEventCallback<string>Se dispara 500 ms después de que el usuario deja de teclear, con el texto actual.
ValuestringTexto del campo.
Placeholderstring"Buscar..."Texto cuando está vacío.
Classstring""Clases CSS extra para el contenedor.
Stylestring""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ámetroTipoDefaultPara qué
ClientDinaupClientCCliente contra el que consulta el informe.
ReportIdstringGUID 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

On this page