Richard.Ma 发表于 2019-7-25 09:20:26

使用ComboBox的MultiColumnComboBox扩展

在我们最新的2019 v1版本中,我们添加了MultiColumnComboBox控件,这是C1 ComboBox Control的扩展。那么,是什么让它与传统的ComboBox不同?此控件不仅限于在DropDown中呈现项目的平面列表,而是在DropDown中呈现Grid。因此,可以在DropDown中显示比标准ComboBox更多的信息。现在我们知道是它与众不同的地方,我们可以讨论可以它可以用于什么场景。假设我们正在为汽车经销商门户开发一个网站,我们希望为用户提供基于制造商(例如福特)选择汽车模型的功能,然后对模型,制造和新/使用做出具体选择。实现这样的功能需要使用一些ComboBox,如下图所示:
https://gccontent.blob.core.windows.net/gccontent/blogs/componentone/20190705-using-multicolumncombobox-extension-for-combobox/image1.PNG我们甚至可能希望显示更多信息,如颜色,折扣和价格范围,提供更多信息以缩小搜索范围。一种方法是允许用户通过从各种选项中进行选择来进行数据过滤。这显然会导致向已经过载的页面添加更多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实例后进行更改。GridItemFormater接受带有两个参数的函数,FlexGrid和FormatItemEventArgs<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.binding == "Discount" && s.rows.dataItem.Discount >= 0.50) {
                e.cell.innerHTML = "<div class='blinking'>" + wijmo.Globalize.format(s.rows.dataItem.Discount,"p2")+"</div>";
            }
            /* Add green background for New cars */
            if (s.columns.binding == "Type" && s.rows.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 CarModel")
      .OnClientIsDroppedDownChanged("DropDownChanged")
      .GridItemFormater("FormatGrid")
    )
</div>
现在已经完成,我们已准备好在我们的项目中使用Multi ComboBox。高级实现:使用MultiColumnComboBox作为FlexGrid的自定义编辑器
MultiColumnComboBox也可以在单元格内使用FlexGrid的自定义编辑器。这使得能够在FlexGrid中实现上述示例(如下面的GIF所示)。https://gccontent.blob.core.windows.net/gccontent/blogs/componentone/20190705-using-multicolumncombobox-extension-for-combobox/image4.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"));
            }
    )
)

页: [1]
查看完整版本: 使用ComboBox的MultiColumnComboBox扩展