I would like to change the text in the ComboBox dropdown when there is no data in the source collection.
At the moment the only option is through localization for all instances like here.
We are needing a way to display a hierarchy inside the ComboBox. I don't see any examples on this particular feature, I had found a similar request, but not identical.
Our use case:
We have administrators that manage multiple tenants within our system. The tenants are part of a hierarchy, the user needs to be able to select a tenant or tenant parent.
I will use hotels as an example:
-Chain 1
--Brand 1
---Property 1
---Property 2
--Brand 2
---Property 3
Our current system that we are migrating controls from has this feature, so I would like to stick as close to this functionality as possible, however; if it is not an option, what control would you suggest as an alternative.
See example (sorry for the redactions)
The core concept is providing a user a choice as part of a form, but layout needs to be organized so that a user can easily navigate. Top level names are unique, all other names can duplicate since they may share similar naming conventions across different organizations.
An option that may work as an alternative, is invoking a dialog popup and within it having a tree list of the information I need. I think it could work, but it would certainly break the flow of the form.
If my browser culture is set to Swedish, I can no longer tab through multiple ComboBoxes.
<AdminEdit>
You can manually add the TabIndex parameter to each ComboBox and set their values to non-negative integers.
</AdminEdit>
If the AllowCustom parameter is set to true and the OnChange fires during the data load, the value in the OnChange handler is null. Press Enter before the data load ends and the OnChange handler will give null instead of the current input value.
If I enter a text and press enter when there are no items (yet), I expect it to call the OnChange with that text. Even with a static list of zero items (replace 'Read=' with 'Data=' en provide a new List<>()), the OnChange is passed a null value.
If the OnChange fires before the empty dropdown get opened, it passes a null value, if it fires after the empty dropdown opens, it passes the entered text. That doesn't sound logical to me. Why needs the (empty) dropdown to be open before the data gets passed? And if that is necessary, why gets the OnChange fired before the dropdown is opened, and doesn't wait till it is open and then fire with the entered data?
I would like to use an event that fires only when the user clicks on an item from the dropdown.
=====
ADMIT EDIT:
Here is a possible way to achieve this now:
<TelerikComboBox @bind-Value=@SelectedValue
Data="@ComboBoxData"
ValueField="ProductId"
TextField="ProductName">
<ItemTemplate>
@{
var currentItem = context as Product;
<div onclick="@(() => OnClickHandler(currentItem))" style="width:100%">
@currentItem.ProductName
</div>
}
</ItemTemplate>
</TelerikComboBox>
@code {
private void OnClickHandler(Product item)
{
//the application logic here
}
public IEnumerable<Product> ComboBoxData { get; set; }
public int SelectedValue { get; set; } = 2;
protected override void OnInitialized()
{
List<Product> products = new List<Product>();
for (int i = 1; i < 10; i++)
{
products.Add(new Product()
{
ProductId = i,
ProductName = $"Product {i}",
UnitPrice = (decimal)(i * 3.14)
});
}
ComboBoxData = products;
base.OnInitialized();
}
public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
}
}
I have a ComboBox that allows me to select different entities that I want to edit data for. Some of this data involves selecting other options from ComboBoxes. When I type in my cascading filterable ComboBox to select an item, its value changes accordingly, but when I change the entity I'm editing, that ComboBox doesn't display the selected value, even though there is a selected value present.
Reproduction: https://blazorrepl.telerik.com/GGYgmlFA45guzWlg06.
Steps to reproduce:
In my data, I have multiple identical values for the TextField of the ComboBox. When the user selects one of them and focuses away from the component the selected value changes to the first instance of the items with the same TextFields, although they have different ValueFields.
Reproduction:
<TelerikComboBox Data="@myDdlData"
TextField="MyTextField"
ValueField="MyValueField"
Value="selectedValue"
ValueChanged="@((int? id) => ValueChangedHandler(id))"
FilterOperator="StringFilterOperator.Contains"
Filterable="true">
</TelerikComboBox>
@code {
private List<MyDdlModel> myDdlData { get; set; }
private void ValueChangedHandler(int? id)
{
selectedValue = id;
}
public class MyDdlModel
{
public int? MyValueField { get; set; }
public string MyTextField { get; set; }
}
int? selectedValue { get; set; }
protected override void OnInitialized()
{
myDdlData = new List<MyDdlModel>()
{
new MyDdlModel()
{
MyValueField = 1,
MyTextField = "John Smith"
},
new MyDdlModel()
{
MyValueField = 2,
MyTextField = "John Smith"
},
new MyDdlModel()
{
MyValueField = 3,
MyTextField = "John Smith"
},
new MyDdlModel()
{
MyValueField = 4,
MyTextField = "Alice Jones"
},
new MyDdlModel()
{
MyValueField = 5,
MyTextField = "Alice Jones"
},
};
}
}
Description
When the user types a value in the input and wishes to navigate to the beginning or end (by pressing Home/End buttons) of the input to make a correction, a value from the popup is actually selected and the value in the input is overridden.
Reproduction
1. Create a ComboBox and enable filtering.
2. Start typing in the input. Popup is opened.
3 Try to navigate in the input via the Home/End buttons. A value from the popup is selected that overrides the value in the input.
Hi Telerik Team,
One of the requirements for my team project is that the ComboBox needs to be sorted in descending order to list dates. We need to sort the groups and the options inside the groups.
Ideally, the ComboBox can have a SortDirection parameter that defines the order as SortAscending or SortDescending, and can display the ComboBox groups and options accordingly.
===
Admin Edit:
It would be useful if you could disable the default sorting of the groups as well.
A ComboBox is databound via OnRead. It has an initial value, but no data arrives after the first OnRead call. We call Rebind() to fetch data and then it populates, but the component value doesn't show.
Click the button. The ComboBox should show its initial value, but doesn't. A similar scenario worked until version 2.30, when there was no Rebind(), but we set Data directly.
The workaround is to set raise a flag in OnRead and set the value in OnAfterRenderAsync.
@using Telerik.DataSource.Extensions
<TelerikButton OnClick="@BindCombo">Rebind Combo</TelerikButton>
<TelerikComboBox TItem="@ComboItem"
TValue="int"
@ref="@ComboRef"
TextField="Text"
ValueField="Id"
OnRead="OnComboRead"
Width="200px"
@bind-Value="@ComboValue">
</TelerikComboBox>
@code {
string FilterValue { get; set; } = "A";
int ComboValue { get; set; } = 2;
bool BindFlag { get; set; }
bool ShouldResetValue { get; set; }
IEnumerable<ComboItem> LegacyComboData { get; set; }
TelerikComboBox<ComboItem, int> ComboRef { get; set; }
void BindCombo()
{
BindFlag = true;
ComboRef.Rebind();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (ShouldResetValue)
{
// comment out the initially set value above to make the following line work
ComboValue = 2;
StateHasChanged();
}
await base.OnAfterRenderAsync(firstRender);
}
async Task OnComboRead(ComboBoxReadEventArgs args)
{
if (BindFlag)
{
var service = new MyService();
var data = await service.GetComboItem(FilterValue);
var result = await data.ToDataSourceResultAsync(args.Request);
args.Data = result.Data;
//ShouldResetValue = true;
}
}
public class ComboItem
{
public int Id { get; set; }
public string Code { get; set; }
public string Text { get; set; }
}
public class MyService
{
public async Task<IEnumerable<ComboItem>> GetComboItem(string code)
{
await Task.Delay(300);
var data = new[]
{
new ComboItem{ Id = 1, Code = "A", Text = "ValueA1" },
new ComboItem{ Id = 2, Code = "A", Text = "ValueA2" },
new ComboItem{ Id = 3, Code = "A", Text = "ValueA3" },
new ComboItem{ Id = 4, Code = "B", Text = "ValueB4" },
new ComboItem{ Id = 5, Code = "B", Text = "ValueB5" },
new ComboItem{ Id = 6, Code = "B", Text = "ValueB6" },
new ComboItem{ Id = 7, Code = "C", Text = "ValueC7" },
new ComboItem{ Id = 8, Code = "C", Text = "ValueC8" },
new ComboItem{ Id = 9, Code = "C", Text = "ValueC9" },
};
return data.Where(x => x.Code == code).ToList();
}
}
}
The ComboBox will not display an initial selected item, if the value is equal to the type's default. Applies to integers, guids, etc.
This used to work until version 2.30.
Here is a REPL test page.
If the value type is nullable, a zero int value will work for initial item selection.
Hello, I would like to have a mutiselect dropdown like you have for ajax:
https://demos.telerik.com/aspnet-ajax/combobox/examples/functionality/checkboxes/defaultcs.aspx
Syncfusion and radzen have this support for blazor :
https://blazor.syncfusion.com/demos/multiselect-dropdown/checkbox?theme=bootstrap5
https://blazor.radzen.com/dropdown
I know that you have a proposed solution for the MultiSelect component:
But the design of this one is not what I'm after, the box still expands downwards when selecting multiple items and it makes it hard to design a coherent page that does not make the dom "jump around". Also the implementation is cumbersome for more complex objects .
It would be better with a solution like you have for ajax where it just shows the first items that fits and then "+X items".
See this REPL:
https://blazorrepl.telerik.com/QmOFQTbW46QegjwX11
Run the program and scroll so that new data will be requested. The page variable does not change, so I'm not able to request new data from my datasource.
GitHub Repo - https://github.com/benhysell/BlazorGridPagingIssue
Expected Behavior - In the ComboBox ItemTemplate show the user's email address along with user name
Actual Behavior - Works fine debugging in Visual Studio, however in a published application the browser throws exception and will not display user's email address in the ItemTemplate.
Steps To Reproduce
Details
Ran across this in a larger application...I have a class that inherits from Microsoft.AspNetCore.Identity.IdentityUser<Guid> and wanted to display all of my users in a ComboBox with a custom ItemTemplate consisting of the Name and Email. This works great in debug, however every time I publish/deploy the Email address is not shown. The example repo is a stripped down version of the larger application reproducing the error.
The application is making an OData call to the backend to retrieve the Users...in the repo we do not goto a database, in the live application we do. In both instances the user's Email is not shown in the ItemTemplate, even though one can see via the browser's network traffic tab the results from the OData call include the email address for the users.
This issue does not just affect the email property, I was unable to get any of the properties listed on Microsoft.AspNetCore.Identity.IdentityUser<Guid> to render in a published application in the ItemTemplate for the Combobox.
Note - all of the properties in Microsoft.AspNetCore.Identity.IdentityUser<Guid> are marked as 'virtual'. I attempted to re-create this issue with a different class, in the repo I used the WeatherForecast class and created a virtual TemperatureK property...this however worked in debug and release without issue. One can see this in the OData Weather Forecasts ComboBox on the same page, https://localhost:5001/createWeather.
Issue - Setting the selected element of a combo box inside a form worked in 2.22.0 and no longer works in 2.23.0
Repo - https://github.com/benhysell/BlazorGridPagingIssue
Steps to Reproduce
Details
This is a contrived example pulled out of a larger application. Almost all of our combo boxes are backed by OData calls. When we 'create or POST' an element the first time we load the form we have the combo box make an OData call to retrieve the top 200 elements. On a subsequent 'edit or PUT', where we have a thing we want to update we first go get the thing we want to work with, and then fill in the comobo box with that element.
In this example application we simulate this load by deciding if a value was passed in or not for the combo box. https://localhost:5001/updateWeather always passes in an 8 to load the 8th element. https://localhost:5001/createWeather does not pass in any value, leaving the form value unbound.
This all worked as expected in 2.22.0, however once we upgraded to 2.23.0 we could no longer set the value of the combo box on load when combined with an OData call.
Thanks for adding more new controls to Blazor. That help us to move to it from ASPX AJAX.
Can we have the Multi-Column ComboBox, like the ASPX AJAX that one, please?
https://www.telerik.com/products/aspnet-ajax/ajax-multicolumncombobox.aspx
Example Repo: https://github.com/benhysell/BlazorGridPagingIssue
Steps To Reproduce
Transitioning our application from Telerik React to Blazor, our comboboxes in our React application are hooked up to OData endpoints because of the amount of data they could display, some as large as 30mb of json.
Server filtering, https://feedback.telerik.com/blazor/1447481-server-filtering-with-custom-data-request-event-that-can-accommodate-remote-data, almost works, however:
I tried setting up my combobox like my OData Grid, i.e.
<TelerikComboBox Data="@Dtos"
OnRead="@ReadItems"
Filterable="true"
Placeholder="Find what you seek by typing"
@bind-Value="@SelectedValue"
TextField="Name"
ValueField="Id"
Pageable="true"
PageSize="20"
TotalCount=@Dtos.Count
>
However it throws an exception:
blazor.webassembly.js:1 WASM: System.InvalidOperationException: Object of type 'Telerik.Blazor.Components.TelerikComboBox`2[[MyType, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]' does not have a property matching the name 'Pageable'.
Was hoping this would 'just work' like it does with the Grid, which is amazing!