Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Партнеры
Рекрутерам: Прескрининг кандидатов about
Топ контрибуторов
loading
loading
Знаете ли Вы, что

Свои вопросы для тестов можно добавлять на странице с информацией о тесте. При этом для некоторых тестов добавление вопросов закрыто

Лента обновлений
ссылка 09:16:58
Комментарий от uic:
много вопросов, содержащих синтаксис с++11.
для теста по STL...
ссылка Nov 20 18:33
Комментарий от kozak95:
согласен
ссылка Nov 20 14:11
Комментарий от Leff:
pt, pc? Вы это серьезно? Рубеж 2017-2018 за окном!
Зачем де...
ссылка Nov 20 13:47
Комментарий от Leff:
19/20, но много вопросов по тем понятиям, которые уже давно...
ссылка Nov 20 01:38
Добавлен вопрос в тест CSS - Основы
Статистика

Тестов: 153, вопросов: 8578. Пройдено: 387276 / 1881083.

Фильтрующий ComboBox на Wpf

head tail Статья
дата15.05.2015
авторmaintwister
голосов3

В этом описании приводится пример использования элемента управления ComboBox, разработанный для легкого управления содержанием выпадающего списка. Приведенная модификация ComboBox позволяет применять критерии на единицы списка.

С чего все началось?

Все мы встречались с элементом управления “Выпадающий список”. Где его только не встретишь: странички в нашем браузере, игры, программы по работе с текстом, формы настройки параметров системы, форма выбора сотрудника в 1С, GUI клиентов электронной почты, форма выбора разработчика в TeamFoundationServer и т.д. Самые разные программы применяют его в своих решениях.

И все хорошо до тех пор, пока элементов в списке не слишком много, скажем меньше 20. А во что превращается выпадающий список, когда число, к примеру, сотрудников становиться 200, 500, 1000. Сделать выбор из такого списка становится проблемой. И эту проблему современные “выпадающие списки” обходят. Один из способов выводить элементы списка упорядоченно по алфавиту. Но более изящный подход к проблеме заключается в том, чтобы предоставить пользователю возможность редактировать текстовое поле ComboBox. Так выпадающий список в TFS и 1С сам предлагает варианты, когда пользователь набирает правильное начало фамилии какого-либо разработчика.

Все же в этом способе тоже есть небольшой недостаток. Предположим, у бухгалтера в организации 1000 сотрудников. Перед бухгалтером стоит задача вывести информацию о некотором сотруднике Петре Рудольфовиче, фамилию которого она не помнит, но если ей эту фамилию озвучат, то она сразу ее вспомнит. И что ей делать? Ведь в 1С ComboBox выберет Петра Рудольфовича только если, бухгалтер введет в текстовое поле первую часть его фамилии.

Предлагается оставлять в выпадающем списке только те элементы, которые удовлетворяют некоторому условию сравнения с введенной текстовом поле строкой

Эволюция ComboBox



Продолжим пример с бухгалтером и Петром Рудольфовичем. Сущность сотрудников будем описывать классом Person:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DropDownFilterProject.Samples
{
    public class Person
    {
        public String FirstName { set; get; }
        public String NameByFather { set; get; }
        public String Surname { set; get; }
        public String FullName { get { return String.Format("{0} {1} {2}", Surname, FirstName, NameByFather); } }
    }
}

Свойство FullName будет тем самым ключевым атрибутом в поиске. Создаем самую простую форму для бухгалтера MainForm:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DropDownFilterProject" x:Class="DropDownFilterProject.MainWindow"
        xmlns:sam="clr-namespace:DropDownFilterProject.Samples"
    
        Title="MainWindow" Height="400" Width="1096.344">
    <Grid>
        <local:FilterComboBox 
            x:Name="comboBox"
            IsEditable="True"            
            TextSearch.TextPath="FullName"
            HorizontalAlignment="Left"
            Margin="161,123,0,0"            
            VerticalAlignment="Top" 
            Width="647"
            Height="39">
            <local:FilterComboBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="LightYellow" BorderThickness="1.5" Width="{Binding ElementName=comboBox, Path=Width}">
                        <StackPanel Orientation="Vertical">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock FontWeight="Thin">Фамилия:</TextBlock>
                                <TextBlock FontWeight="Bold" Text="{Binding Surname}" ></TextBlock>
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock FontWeight="Thin">Имя:</TextBlock>
                                <TextBlock FontWeight="Bold" Text="{Binding FirstName}"></TextBlock>
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock FontWeight="Thin">Отчество:</TextBlock>
                                <TextBlock FontWeight="Bold" Text="{Binding NameByFather}"></TextBlock>
                            </StackPanel>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </local:FilterComboBox.ItemTemplate>
            <local:FilterComboBox.ItemsSource>
                <sam:PersonCollection></sam:PersonCollection>
            </local:FilterComboBox.ItemsSource>            
        </local:FilterComboBox>
        <GroupBox Header="Выбор сотрудника:" HorizontalAlignment="Left" Margin="149,97,0,0" VerticalAlignment="Top" Height="77" Width="679"/>
        <Button Content="Открыть зарплатный график сотрудника" HorizontalAlignment="Left" Margin="149,195,0,0" VerticalAlignment="Top" Width="320" Height="34"/>
    </Grid>
</Window>

Зная имя и отчество Петра Рудольфовича и запамятовав его фамилию, бухгалтер введет Рудольфович и сразу же увидит искомого Крамского.

Примеры использования:

Приведенная реализация позволяет задавать различные способы фильтрации списка, для этого служит свойство Filter. По умолчанию отображаются все элементы, в которых входит в качестве подстроки текст из редактируемого поля. Также можно дополнять свойство FullName различными параметрами. Например:

1. Свойство FullName можно дополнить местом рождения, и фильтровать, к примеру, по «Новосибирск». Или дополнить должностью и                     фильтровать по «начальник отдела»

2. Фильтр по умолчанию можно заменить собственным, который, к примеру латинские буквы переводит в русские, а потом уже проверяет вхождение. Или написать фильтр, который слово «Heljkma» сначала транслирует в «Рудольф», а потом проверяет вхождение.

Ссылка на .NET проект:

 https://drive.google.com/folderview?id=0B08rWwFcshTwUWxCdV9mamdvMTg&usp=sharing

Если Вам понравилась статья, проголосуйте за нее

Голосов: 3  loading...
maintwister   Nadya2308   ganzaev