在我们最新的2019 v1版本中,我们添加了MultiColumnComboBox控件,这是C1 ComboBox Control的扩展。那么,是什么让它与传统的ComboBox不同?此控件不仅限于在DropDown中呈现项目的平面列表,而是在DropDown中呈现Grid。因此,可以在DropDown中显示比标准ComboBox更多的信息。 现在我们知道是它与众不同的地方,我们可以讨论可以它可以用于什么场景。 假设我们正在为汽车经销商门户开发一个网站,我们希望为用户提供基于制造商(例如福特)选择汽车模型的功能,然后对模型,制造和新/使用做出具体选择。 实现这样的功能需要使用一些ComboBox,如下图所示:
我们甚至可能希望显示更多信息,如颜色,折扣和价格范围,提供更多信息以缩小搜索范围。一种方法是允许用户通过从各种选项中进行选择来进行数据过滤。这显然会导致向已经过载的页面添加更多ComboBox。 如果页面只有一个显示此信息的ComboBox,从而节省屏幕空间和达到用户所需操作,对最终用户来说会不会更容易?
使用ComponentOne MultiColumnComboBox,我们可以在一个单个ComboBox中轻松实现这一点。用户可以在TextBox中键入汽车制造商名称“Ford”,它将显示一个以品牌,型号,颜色,折扣,类型和价格范围为列的网格。这将提供有关“福特”的所有相关信息的快速和详细的一览,如下图所示。此外,它使页面的用户体验比以前更好。 接下来,我们将介绍: - 设置项目以使用MultiColumnComboBox控件
- 添加MultiColumnComboBox作为输入
- 格式化控件的下拉列表
- 使用MultiColumnComboBox作为FlexGrid的自定义编辑器
设置项目以使用MultiColumnComboBox控件使用C1 MVC Standard模板创建一个新的MVC项目。该模板自动处理注册资源,命名空间和许可。 从Extension samples bin文件夹中将C1.Web.Mvc.Extension.DLL的引用添加到项目中。(如果在解决方案中找不到C1.Web.Mvc.Extension.DLL,那么我们需要rebuild 解决方案以获得此程序集。) 在web.config文件的system.web.webPages.razor下添加以下名称空间。 <namespaces></namespaces><add namespace="C1.Web.Mvc.Extensions.Fluent" /> 在_Layout.cshtml文件中,通过在head标记@ Html.RegisterMultiColumnComboBoxScripts()中添加以下代码来注册资源
完成上述步骤后,我们就可以在项目中使用MultiColumnComboBox作为输入控件。 添加MultiColumnComboBox作为输入
在这里,我们将在项目中添加MultiColumnComboBox作为InputControl。该控件在“ 自定义 ”HTMLHelperExtension中可用,并且可以在需要的网页中使用以下代码添加: - <style>
- /* Change the Dropdown width*/
- .wj-dropdown-panel {
- max-width:893px;
- }
- </style>
- @(Html.Custom().MultiColumnComboBox().Id("MultiColumnCmb")
- .Bind(m=>m.Bind(Model).PageSize(10))
- .SelectedValuePath("ID").DisplayMemberPath("Model")
- .IsEditable(false)
- )
复制代码 格式化控件的下拉列表让我们在当前例子中,对grid应用一些格式来突出显示网格中的一些值。 例如,我们可能想要突出显示汽车模型的折扣何时大于或等于50%,我们可以实现“折扣价”在满足此条件时闪烁的功能。 另一个例子是我们想要显示所有具有绿色背景的“新”类型的车型以突出显示它们。
我们可以使用GridItemFormater属性来格式化下拉列表中的项目。如果我们想自定义显示FlexGrid,例如设置列的格式,更改列位置等,我们可以处理OnClientIsDroppedDownChanged事件并在获取FlexGrid实例后进行更改。 - <style>
- input { /* styles the Input element font */
- font-family: Arial !important;
- font-size: 14px !important;
- }
- .wj-cell { /* styles the FlexGrid cells’ font */
- font-family: Arial !important;
- font-size: 14px !important;
- }
- #MultiColumnCmb.wj-content {
- border:1px solid #808080;
- }
- .wj-header{ /* Remove the boldness from FlexGrid’s heade */
- font-weight:normal !important;
- }
- .wj-dropdown-panel {
- max-width:893px;
- }
- .blinking{ /* class to blink the Text in cell */
- animation:blinkingText 0.5s infinite;
- font-weight:bold;
- }
- @@keyframes blinkingText{
- 0%{ color: #000; }
- 50%{ color: red; }
- 100%{ color: #000; }
- }
- </style>
- <script>
- function FormatGrid(s, e) {
- if (e.panel.cellType == wijmo.grid.CellType.Cell) {
- var color = "";
- /* Styles the Discount column if value is 50% by blink text */
- if (s.columns[e.col].binding == "Discount" && s.rows[e.row].dataItem.Discount >= 0.50) {
- e.cell.innerHTML = "<div class='blinking'>" + wijmo.Globalize.format(s.rows[e.row].dataItem.Discount,"p2")+"</div>";
- }
- /* Add green background for New cars */
- if (s.columns[e.col].binding == "Type" && s.rows[e.row].dataItem.Type=="New") {
- e.cell.innerHTML = "<span style='background:green;color:white;padding:1px 6px;'>New</span>";
- }
- e.cell.style.color = color;
- }
- }
- function DropDownChanged(s,e) {
- if (s.isDroppedDown) {
- /* Modify Columns properties to format FlexGrid */
- var grid = wijmo.Control.getControl(s.dropDown.querySelector(".wj-flexgrid"))
- grid.headersVisibility = 'Column';
- grid.columns.getColumn("ID").visible = false;
- grid.columns.getColumn("Make").format = "g";
- var modelCol = grid.columns.getColumn("Model");
- modelCol.width = "*";
- if (modelCol.index == 2) {
- grid.columns.moveElement(2, 1);
- }
- var discntColumn = grid.columns.getColumn("Discount");
- discntColumn.width = 104;
- discntColumn.format = "p2";
- grid.columns.getColumn("Price").format = "c0";
- }
- }
- </script>
- @Html.C1().CollectionViewService().Id("CollectionVeiwService").Bind(Model)
- <div style="margin-top:15px;">
- <span >Select Car Model</span>
- @(Html.Custom().MultiColumnComboBox().Id("MultiColumnCmb")
- .ItemsSourceId("CollectionVeiwService")
- .SelectedValuePath("Model").DisplayMemberPath("Model")
- .PageSize(10)
- .Placeholder("Select Car Model")
- .OnClientIsDroppedDownChanged("DropDownChanged")
- .GridItemFormater("FormatGrid")
- )
- </div>
复制代码
现在已经完成,我们已准备好在我们的项目中使用Multi ComboBox。 高级实现:使用MultiColumnComboBox作为FlexGrid的自定义编辑器
MultiColumnComboBox也可以在单元格内使用FlexGrid的自定义编辑器。这使得能够在FlexGrid中实现上述示例(如下面的GIF所示)。 让我们看看以下步骤: 步骤1:将MultiColumnComboBox添加为自定义编辑器 控件应放在脚本标记内,文本/模板作为类型。我们还需要设置ID属性以引用CellTemplate for FlexGrid。
使用CollectionViewService绑定数据以处理数据解析为json并避免在初始化编辑器时再次请求数据。 - @Html.C1().CollectionViewService().Id("collectionViewService1").Bind(ViewData["Sales"] as List<Sale>)
- <script type="text/template" id="prdctEdtr">
- @(Html.Custom().MultiColumnComboBox().Id("Multi")
- .ItemsSourceId("collectionViewService1")
- .IsEditable(false)
- .SelectedValuePath("Product")
- .DisplayMemberPath("Product").CssStyle("width","100%")
- .TemplateBind("Text", "Product")
- .ToTemplate()
- )
- </script>
复制代码步骤2:将FlexGrid CellTemplate的EditTemplate ID属性设置为包含MultiColumn控件作为编辑器的脚本ID“prdctEdtr”。 - @(Html.C1().FlexGrid().Id("Grid").Bind(Model).AutoGenerateColumns(false).Columns(
- c => {
- c.Add().Binding("ID").Header("ID");
- c.Add().Binding("Product").Header("Product").CellTemplate(ctb=>ctb.EditTemplateId("prdctEdtr"));
- }
- )
- )
复制代码
|