Вывод информации из бд по инициалам средствами linq [закрыт]

105
03 сентября 2019, 12:00

Есть окно с 26 кнопками. Каждая кнопка - одна буква английского алфавита(A-Z). При нажатии на кнопку в datagrid выводится информация из таблицы и буква кнопки соответствует инициалам человека из таблицы. Короче ты тыкаешь например на кнопку E выводится Egor, жмешь на кнопку L выводится Egor Letov. Инфа получается с помощью Linq. Как быстро реализовать через события вывод информации без указания обработчика события для каждой кнопке? И как через методы расширения выбрать инфу по первой букве Фамилии и Имени при том условии что Имя и Фамилия указаны в одном столбце? Как то сумбурно составил вопрос, но готов ответить на вопросы.

Answer 1

Весь код я писать не буду, конечно. дам лишь вектор: Если в свойство Tag положить, например, строковое значение, то подписавшись для каждой кнопки на событие Click, указав один и тот же обработчик, можно достать из sender значение нажатой кнопки:

private void Click(object sender, EventArgs e)
{
    var t = ((ButtonBase)sender).Tag.ToString();
}

что касается фильтрации по имени: хранить все в одном поле -зло). Если данные "чистые", что в реальных проектах всегда ставится под сомнение, то можно, как и написал @tym32167 в коментариях, искать с пробелом. Если же данных мало, то можно вернуть все элементы таблицы и уже тогда копаться в данных всеми доступными средствами и инструментами : разделить ФИО, фильтровать и сортировать по его составляющим

Answer 2

Пример, но с кириллицей. Сделано с привязками, но без MVVM + события нажатия на кнопки.

Класс чела такой

public class PersonModel : INotifyPropertyChanged
{
    //ctor
    public PersonModel(int id)
    {
        if (id <= 0) throw new ArgumentException(nameof(id));
        Id = id;
    }
    public int Id { get; private set; }
    private int _OrderNumber;
    public int OrderNumber
    {
        get => _OrderNumber;
        set
        {
            _OrderNumber = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(OrderNumber)));
        }
    }
    private string _FirstName;
    public string FirstName
    {
        get => _FirstName;
        set
        {
            _FirstName = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FirstName)));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FullName)));
        }
    }
    private string _LastName;
    public string LastName
    {
        get => _LastName;
        set
        {
            _LastName = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(LastName)));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FullName)));
        }
    }
    public string FullName => $"{LastName} {FirstName}";
    public event PropertyChangedEventHandler PropertyChanged;
}

Класс поиска такой

public class PersonSearchModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private char _FirstNameLetter;
    public char FirstNameLetter
    {
        get => _FirstNameLetter;
        set
        {
            _FirstNameLetter = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FirstNameLetter)));
        }
    }
    private char _LastNameLetter;
    public char LastNameLetter
    {
        get => _LastNameLetter;
        set
        {
            _LastNameLetter = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(LastNameLetter)));
        }
    }
    private bool _IsSearchByName;
    public bool IsSearchByName
    {
        get => _IsSearchByName;
        set
        {
            _IsSearchByName = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsSearchByName)));
        }
    }
}

XAML такой

<Grid Margin="15">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <!--Кнопки-->
    <Grid Grid.Column="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Button Grid.Column="0"
                Grid.Row="1"
                Content="А"
                Click="ButtonLetter_Click"/>
        <Button Grid.Column="2"
                Grid.Row="1"
                Content="Б"
                Click="ButtonLetter_Click"/>
        <Button Grid.Column="0"
                Grid.Row="3"
                Content="В"
                Click="ButtonLetter_Click"/>
        <Button Grid.Column="2"
                Grid.Row="3"
                Content="Г"
                Click="ButtonLetter_Click"/>
    </Grid>
    <!--Правая сторона-->
    <Grid Grid.Column="1">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="3*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0"
                    Orientation="Horizontal">
            <StackPanel Margin="10"
                        VerticalAlignment="Center">
                <TextBlock>
                <Run Text="Поиск по фамилии "/>
                <Run Text="{Binding SearchPerson.LastNameLetter}"/>
                <Run Text=" и имени "/>
                <Run Text="{Binding SearchPerson.FirstNameLetter}"/>
                </TextBlock>
                <CheckBox Content="сначала Имя"
                          IsChecked="{Binding SearchPerson.IsSearchByName}"/>
            </StackPanel>
            <Button x:Name="_buttonClearSearch"
                    Content="Сбросить"
                    Height="30"
                    Width="70"
                    Click="ButtonClearSearch_Click"/>
        </StackPanel>
        <DataGrid Grid.Row="1"
                  ItemsSource="{Binding People}"
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Н/П" Binding="{Binding OrderNumber}"/>
                <DataGridTextColumn Header="Сотрудник" Binding="{Binding FullName}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Grid>

Бехайнд код окна такой

public partial class MainWindow : Window, INotifyPropertyChanged
{
    /// <summary>
    /// Источник данных
    /// </summary>
    private readonly IRepository _repository = new TestRepository();
    //INPC
    public event PropertyChangedEventHandler PropertyChanged;
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        LoadData();
    }
    /// <summary>
    /// Список Людей
    /// </summary>
    public ObservableCollection<PersonModel> People { get; set; }
    /// <summary>
    /// Поисковый объект
    /// </summary>
    private PersonSearchModel _SearchPerson;
    public PersonSearchModel SearchPerson
    {
        get => _SearchPerson;
        set
        {
            _SearchPerson = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SearchPerson)));
        }
    }
    /// <summary>
    /// Начальная загрузка данных
    /// </summary>
    private async void LoadData()
    {
        var people = await _repository.GetPeopleAsync();
        people = SetOrderNumbers(people);
        People = new ObservableCollection<PersonModel>(people);
        SearchPerson = new PersonSearchModel { FirstNameLetter = '?', LastNameLetter = '?' };
    }
    /// <summary>
    /// Сортировка и нумеровывание по порядку Людей
    /// </summary>
    /// <param name="people"></param>
    /// <returns></returns>
    private static List<PersonModel> SetOrderNumbers(List<PersonModel> people)
    {
        var pp = people.OrderBy(p => p.LastName).ToList();
        for (int i = 0; i < pp.Count; i++)
        {
            pp[i].OrderNumber = i + 1;
        }
        return pp;
    }
    /// <summary>
    /// Клавиши букв поиска
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private async void ButtonLetter_Click(object sender, RoutedEventArgs e)
    {
        //получаем кнопку и букву на ней
        var button = sender as Button;
        var letter = button.Content.ToString();
        //в зависимости от чексбокса
        if (SearchPerson.IsSearchByName)
        {
            //искать начинаем с имени
            if (SearchPerson.FirstNameLetter == '?')
            {
                SearchPerson.FirstNameLetter = letter[0];
            }
            else
            {
                //иначе добавляем букву для фамилии
                SearchPerson.LastNameLetter = letter[0];
            }
        }
        else
        {
            //искать начинаем с фамилии
            if (SearchPerson.LastNameLetter == '?')
            {
                SearchPerson.LastNameLetter = letter[0];
            }
            else
            {
                //иначе добавляем букву для имени
                SearchPerson.FirstNameLetter = letter[0];
            }
        }
        //обновление списка Людей
        await UpdatePeople();
    }
    /// <summary>
    /// Обновление отображаемого списка Людей
    /// </summary>
    /// <returns></returns>
    private async Task UpdatePeople()
    {
        List<PersonModel> people = null;
        //если искать нечего, то просто перечитываем весь список Людей
        if (SearchPerson.FirstNameLetter == '?' && SearchPerson.LastNameLetter == '?')
        {
            people = await _repository.GetPeopleAsync();
        }
        else
        {
            //иначе пытаемся искать
            people = await _repository.SearchPeopleAsync(SearchPerson);
        }
        if (people.Count == 0)
        {
            MessageBox.Show("Таких не найдено!", "Результат поиска",
                MessageBoxButton.OK, MessageBoxImage.Exclamation);
            //ButtonClearSearch_Click(null, null);
            return;
        }
        //отсортируем и пронумеруем
        people = SetOrderNumbers(people);
        //отобразим
        People.Clear();
        people.ForEach(p => People.Add(p));
    }
    /// <summary>
    /// Кнопка очистки поиска
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private async void ButtonClearSearch_Click(object sender, RoutedEventArgs e)
    {
        SearchPerson.FirstNameLetter = '?';
        SearchPerson.LastNameLetter = '?';
        SearchPerson.IsSearchByName = false;
        await UpdatePeople();
    }
}

Весь пример можно скачать здесь

READ ALSO
Fancybox не срабатывает второй ajax запрос

Fancybox не срабатывает второй ajax запрос

поставил fancybox первое окно - открывается без проблем, но второе переадресовывает на ссылку ajax/send_form_callbackphp вот код с js:

86
Примерное значение в case

Примерное значение в case

Я получаю VK сообщения, в которых содержатся командыНапример, в VK пишу боту "Привет", он по Switch отвечает на это команду "Что тебе здесь нужно?"

112
Как реализовать такое условие на PHP

Как реализовать такое условие на PHP

Как написать условие которое будет это проверятьНапример если за месяц что-то добавилось в БД то выполнить то-то, например вывести Hello World?

96