예제 #1
0
        public void TestParseFilterIntForValueLessThan()
        {
            MyFilteredBindingList <Product> myList = new MyFilteredBindingList <Product>();
            SingleFilterInfo info = myList.ParseFilter("StockNo < 3");

            Assert.AreEqual("StockNo", info.PropName);
            Assert.AreEqual(FilterOperator.LessThan, info.OperatorValue);
            Assert.AreEqual(3, info.CompareValue);
        }
예제 #2
0
        public void TestParseFilterLongDateString()
        {
            MyFilteredBindingList <Product> myList = new MyFilteredBindingList <Product>();
            SingleFilterInfo info = myList.ParseFilter("AddedDate = 5/6/2002 12:00:00 AM");

            Assert.AreEqual("AddedDate", info.PropName);
            Assert.AreEqual(FilterOperator.EqualTo, info.OperatorValue);
            Assert.AreEqual(new DateTime(2002, 5, 6), info.CompareValue);
        }
예제 #3
0
        public void TestParseFilterFloatForValueEqual()
        {
            MyFilteredBindingList <Font> myList = new MyFilteredBindingList <Font>();
            SingleFilterInfo             info   = myList.ParseFilter("Size = 3");

            Assert.AreEqual("Size", info.PropName);
            Assert.AreEqual(FilterOperator.EqualTo, info.OperatorValue);
            Assert.AreEqual(3.0F, info.CompareValue);
        }
예제 #4
0
        public void TestParseFilterDateForValueGreaterThan()
        {
            MyFilteredBindingList <Product> myList = new MyFilteredBindingList <Product>();
            SingleFilterInfo info = myList.ParseFilter("AddedDate > 5/6/2002");

            Assert.AreEqual("AddedDate", info.PropName);
            Assert.AreEqual(FilterOperator.GreaterThan, info.OperatorValue);
            Assert.AreEqual(new DateTime(2002, 5, 6), info.CompareValue);
        }
예제 #5
0
        public void TestParseFilterStringForValueEqualQuotes()
        {
            MyFilteredBindingList <Product> myList = new MyFilteredBindingList <Product>();
            SingleFilterInfo info = myList.ParseFilter("Category = 'Something'");

            Assert.AreEqual("Category", info.PropName);
            Assert.AreEqual(FilterOperator.EqualTo, info.OperatorValue);
            Assert.AreEqual("Something", info.CompareValue);
        }
예제 #6
0
        internal void ApplyFilter(SingleFilterInfo filterParts)
        {
            List <T> results;

            // Check to see if the property type we are filtering by implements
            // the IComparable interface.
            Type interfaceType =
                TypeDescriptor.GetProperties(typeof(T))[filterParts.PropName]
                .PropertyType.GetInterface("IComparable");

            if (interfaceType == null)
            {
                throw new InvalidOperationException("Filtered property" +
                                                    " must implement IComparable.");
            }

            results = new List <T>();

            // Check each value and add to the results list.
            foreach (T item in this)
            {
                IComparable compareValue = filterParts.PropDesc.GetValue(item) as IComparable;


                if (compareValue != null)
                {
                    if (filterParts.OperatorValue == "%LIKE%" && (compareValue + "").ToLower().Contains((filterParts.CompareValue + "").ToLower()))
                    {
                        results.Add(item);
                    }
                    else
                    {
                        int result = compareValue.CompareTo(filterParts.CompareValue);
                        if (filterParts.OperatorValue == "=" && result == 0)
                        {
                            results.Add(item);
                        }
                        else if (filterParts.OperatorValue == ">" && result > 0)
                        {
                            results.Add(item);
                        }
                        else if (filterParts.OperatorValue == "<" && result < 0)
                        {
                            results.Add(item);
                        }
                    }
                }
            }
            this.ClearItems();
            foreach (T itemFound in results)
            {
                this.Add(itemFound);
            }
        }
예제 #7
0
        public void TestApplyFilterStringEquals()
        {
            MyFilteredBindingList <Product> myList = new MyFilteredBindingList <Product>();

            myList.Add(new Product("Gadgets", "TickTock", 56000, new DateTime(2002, 5, 6)));
            myList.Add(new Product("Games", "TickTock", 56000, new DateTime(2002, 5, 6)));
            myList.Add(new Product("Gadgets", "Jumper", 56000, new DateTime(2002, 5, 6)));
            myList.Add(new Product("Games", "Jumper", 56000, new DateTime(2002, 5, 6)));
            SingleFilterInfo info = myList.ParseFilter("Category = 'Gadgets'");

            myList.ApplyFilter(info);
            Assert.AreEqual(myList.Count, 2);
        }
예제 #8
0
        internal SingleFilterInfo ParseFilter(string filterPart)
        {
            SingleFilterInfo filterInfo = new SingleFilterInfo();

            filterInfo.OperatorValue = DetermineFilterOperator(filterPart);

            string[] filterStringParts =
                filterPart.Split(filterInfo.OperatorValue.ToCharArray()).Where(p => !string.IsNullOrEmpty(p)).ToArray();

            filterInfo.PropName =
                filterStringParts[0].Replace("[", "").
                Replace("]", "").Replace(" AND ", "").Trim();

            // Get the property descriptor for the filter property name.
            PropertyDescriptor filterPropDesc =
                TypeDescriptor.GetProperties(typeof(T))[filterInfo.PropName];

            // Convert the filter compare value to the property type.
            if (filterPropDesc == null)
            {
                throw new InvalidOperationException("Specified property to " +
                                                    "filter " + filterInfo.PropName +
                                                    " on does not exist on type: " + typeof(T).Name);
            }

            filterInfo.PropDesc = filterPropDesc;

            string comparePartNoQuotes = StripOffQuotes(filterStringParts[1]);

            try
            {
                TypeConverter converter =
                    TypeDescriptor.GetConverter(filterPropDesc.PropertyType);
                filterInfo.CompareValue =
                    converter.ConvertFromString(comparePartNoQuotes);
            }
            catch (NotSupportedException)
            {
                throw new InvalidOperationException("Specified filter" +
                                                    "value " + comparePartNoQuotes + " can not be converted" +
                                                    "from string. Implement a type converter for " +
                                                    filterPropDesc.PropertyType.ToString());
            }
            return(filterInfo);
        }