Есть окно с 26 кнопками. Каждая кнопка - одна буква английского алфавита(A-Z). При нажатии на кнопку в datagrid выводится информация из таблицы и буква кнопки соответствует инициалам человека из таблицы. Короче ты тыкаешь например на кнопку E выводится Egor, жмешь на кнопку L выводится Egor Letov. Инфа получается с помощью Linq. Как быстро реализовать через события вывод информации без указания обработчика события для каждой кнопке? И как через методы расширения выбрать инфу по первой букве Фамилии и Имени при том условии что Имя и Фамилия указаны в одном столбце? Как то сумбурно составил вопрос, но готов ответить на вопросы.
Весь код я писать не буду, конечно. дам лишь вектор: Если в свойство Tag положить, например, строковое значение, то подписавшись для каждой кнопки на событие Click, указав один и тот же обработчик, можно достать из sender значение нажатой кнопки:
private void Click(object sender, EventArgs e)
{
var t = ((ButtonBase)sender).Tag.ToString();
}
что касается фильтрации по имени: хранить все в одном поле -зло). Если данные "чистые", что в реальных проектах всегда ставится под сомнение, то можно, как и написал @tym32167 в коментариях, искать с пробелом. Если же данных мало, то можно вернуть все элементы таблицы и уже тогда копаться в данных всеми доступными средствами и инструментами : разделить ФИО, фильтровать и сортировать по его составляющим
Пример, но с кириллицей. Сделано с привязками, но без 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();
}
}
Весь пример можно скачать здесь
Виртуальный выделенный сервер (VDS) становится отличным выбором
поставил fancybox первое окно - открывается без проблем, но второе переадресовывает на ссылку ajax/send_form_callbackphp вот код с js:
Я получаю VK сообщения, в которых содержатся командыНапример, в VK пишу боту "Привет", он по Switch отвечает на это команду "Что тебе здесь нужно?"
Как написать условие которое будет это проверятьНапример если за месяц что-то добавилось в БД то выполнить то-то, например вывести Hello World?