1 /* ****************************************************************************
\r
3 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5 * This software is subject to the Microsoft Public License (Ms-PL).
\r
6 * A copy of the license can be found in the license.htm file included
\r
7 * in this distribution.
\r
9 * You must not remove this notice, or any other, from this software.
\r
11 * ***************************************************************************/
\r
13 namespace System.Web.Mvc {
\r
15 using System.Collections;
\r
16 using System.Collections.Generic;
\r
17 using System.Diagnostics.CodeAnalysis;
\r
18 using System.Globalization;
\r
20 using System.Web.UI;
\r
22 [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
\r
23 [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Multi",
\r
24 Justification = "Common shorthand for 'multiple'.")]
\r
25 public class MultiSelectList : IEnumerable<SelectListItem> {
\r
27 public MultiSelectList(IEnumerable items)
\r
28 : this(items, null /* selectedValues */) {
\r
31 public MultiSelectList(IEnumerable items, IEnumerable selectedValues)
\r
32 : this(items, null /* dataValuefield */, null /* dataTextField */, selectedValues) {
\r
35 public MultiSelectList(IEnumerable items, string dataValueField, string dataTextField)
\r
36 : this(items, dataValueField, dataTextField, null /* selectedValues */) {
\r
39 public MultiSelectList(IEnumerable items, string dataValueField, string dataTextField, IEnumerable selectedValues) {
\r
40 if (items == null) {
\r
41 throw new ArgumentNullException("items");
\r
45 DataValueField = dataValueField;
\r
46 DataTextField = dataTextField;
\r
47 SelectedValues = selectedValues;
\r
50 public string DataTextField {
\r
55 public string DataValueField {
\r
60 public IEnumerable Items {
\r
65 public IEnumerable SelectedValues {
\r
70 [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
\r
71 public virtual IEnumerator<SelectListItem> GetEnumerator() {
\r
72 return GetListItems().GetEnumerator();
\r
75 [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate",
\r
76 Justification = "Operation performs conversions and returns a unique instance on each call.")]
\r
77 internal IList<SelectListItem> GetListItems() {
\r
78 return (!String.IsNullOrEmpty(DataValueField)) ?
\r
79 GetListItemsWithValueField() :
\r
80 GetListItemsWithoutValueField();
\r
83 private IList<SelectListItem> GetListItemsWithValueField() {
\r
84 HashSet<string> selectedValues = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
\r
85 if (SelectedValues != null) {
\r
86 selectedValues.UnionWith(from object value in SelectedValues select Convert.ToString(value, CultureInfo.CurrentCulture));
\r
89 var listItems = from object item in Items
\r
90 let value = Eval(item, DataValueField)
\r
91 select new SelectListItem {
\r
93 Text = Eval(item, DataTextField),
\r
94 Selected = selectedValues.Contains(value)
\r
96 return listItems.ToList();
\r
99 private IList<SelectListItem> GetListItemsWithoutValueField() {
\r
100 HashSet<object> selectedValues = new HashSet<object>();
\r
101 if (SelectedValues != null) {
\r
102 selectedValues.UnionWith(SelectedValues.Cast<object>());
\r
105 var listItems = from object item in Items
\r
106 select new SelectListItem {
\r
107 Text = Eval(item, DataTextField),
\r
108 Selected = selectedValues.Contains(item)
\r
110 return listItems.ToList();
\r
113 private static string Eval(object container, string expression) {
\r
114 object value = container;
\r
115 if (!String.IsNullOrEmpty(expression)) {
\r
116 value = DataBinder.Eval(container, expression);
\r
118 return Convert.ToString(value, CultureInfo.CurrentCulture);
\r
121 #region IEnumerable Members
\r
122 [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
\r
123 IEnumerator IEnumerable.GetEnumerator() {
\r
124 return GetEnumerator();
\r