Как сделать повторное срабатывание события

Рейтинг: 0Ответов: 1Опубликовано: 25.05.2023

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

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {

        
        if (dataGridView1.Columns[6].HeaderText == "Статус" & e.Clicks == 1)
        {

            var statusClick = context.Inventories.Select(x => new
            {
                id = x.Inventid,
                name = x.Inventname,
                serial = x.Serialnum,
                datepov = x.Datepov,
                datenextpov = x.Datenextpov,
                filial = x.Filial.Filialname,
                status = x.Status.Statusname,
                service = x.Service.Servicename,
                yearofman = x.Yearofman
            }).AsEnumerable().Where(x => x.status == "Поверено")
          .ToList();
            dataGridView1.DataSource = statusClick;

        }   
        else if (dataGridView1.Columns[6].HeaderText == "Статус" & e.Clicks == 2) 
         {
                var statusClick = context.Inventories.Select(x => new
                {
                    id = x.Inventid,
                    name = x.Inventname,
                    serial = x.Serialnum,
                    datepov = x.Datepov,
                    datenextpov = x.Datenextpov,
                    filial = x.Filial.Filialname,
                    status = x.Status.Statusname,
                    service = x.Service.Servicename,
                    yearofman = x.Yearofman
                }).AsEnumerable().Where(x => x.status == "Не поверяется")
        .ToList();
                dataGridView1.DataSource = statusClick;

                
        }

Ответы

▲ 2Принят

Не повторяйте свой код. Используйте методы.

private void FilterStatus(string status)
{
    var filtered = context.Inventories.Select(x => new
    {
        id = x.Inventid,
        name = x.Inventname,
        serial = x.Serialnum,
        datepov = x.Datepov,
        datenextpov = x.Datenextpov,
        filial = x.Filial.Filialname,
        status = x.Status.Statusname,
        service = x.Service.Servicename,
        yearofman = x.Yearofman
    }).AsEnumerable().Where(x => x.status == status)
    .ToList();
    dataGridView1.DataSource = filtered;
}

Тогда можно написать вот такой обработчик.

private string currentStatus = "Поверено";

private void SwitchStatus()
{
    if (currentStatus == "Поверено")
        currentStatus = "Не поверяется";
    else
        currentStatus = "Поверено";
}

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (dataGridView1.Columns[6].HeaderText == "Статус")
    {
        SwitchStatus();
        FilterStatus(currentStatus);
    }
}

Вот и вся магия.

Но в целом, у вас идет запрос к БД на каждый такой клик. А стоит ли? Быть может проще не обращаться к БД, а изначально загрузить из нее все данные, а фильтровать их через BindingSource? Подумайте над этим.


Еще обратите внимание на & в условии, изучите разницу между & и &&.