LINQ: динамическое предложение Where с переключением комбинации случаев - PullRequest
0 голосов
/ 22 мая 2018

У меня есть список, привязанный к angridview, и я хочу иметь возможность создавать условия фильтра «Где», в то время как комбинация параметров фильтра контролируется пользователем.

Каков наилучший способ фильтрацииисходное логическое свойство списка по модели и позволяет переключать все условия фильтра?

Я знаю, что filterdList не является необходимостью, но любое другое решение, которое я уже видел, не позволяет переключать условие условия Where.

public partial class Form1 : Form
{
    List<dummy> Origlist = new List<dummy> {
        new dummy { pk = 1 ,  istype1 = true,  istype2  = false, istype3=false, istype4=false },
        new dummy { pk = 2 ,  istype1 = true,  istype2 = false,  istype3=false, istype4=false },
        new dummy { pk = 3 ,  istype1 = false, istype2 = true,   istype3=false, istype4=false },
        new dummy { pk = 4 ,  istype1 = false, istype2 = true,   istype3=false, istype4=false },
        new dummy { pk = 5 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
        new dummy { pk = 6 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
        new dummy { pk = 7 ,  istype1 = false, istype2 = false,  istype3=false, istype4=true },
        new dummy { pk = 8 ,  istype1 = false, istype2 = false,  istype3=false, istype4=true },
        new dummy { pk = 9 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
        new dummy { pk = 10 , istype1 = false, istype2 = true,   istype3=false, istype4=false },
        new dummy { pk = 11 , istype1 = false, istype2 = false,  istype3=false, istype4=false }
        };
    List<dummy> filteredList = new List<dummy>(); 
    public Form1()
    {
        InitializeComponent();
    }

    private void Bind()
    {
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = filteredList;
    }


    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked)
        {
            filteredList.AddRange(Origlist.Where(a => a.istype1 == true).ToList());
        }
        else
        {
            filteredList.RemoveAll(a => a.istype1 == true);
        }
        Bind();
    }



    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox2.Checked)
        {
            filteredList.AddRange(Origlist.Where(a => a.istype2 == true).ToList());
        }
        else
        {
            filteredList.RemoveAll(a => a.istype2 == true);
        }
        Bind();
    }

    private void checkBox3_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox3.Checked)
        {
            filteredList.AddRange(Origlist.Where(a => a.istype3 == true).ToList());
        }
        else
        {
            filteredList.RemoveAll(a => a.istype3 == true);
        }
        Bind();
    }

    private void checkBox4_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox4.Checked)
        {
            filteredList.AddRange(Origlist.Where(a => a.istype4 == true).ToList());
        }
        else
        {
            filteredList.RemoveAll(a => a.istype4 == true);
        }
        Bind();
    }

}

simulation

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

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

List<dummy> Origlist = new List<dummy> 
{
    new dummy { pk = 1 ,  istype1 = true,  istype2 = false,  istype3=false, istype4=false },
    new dummy { pk = 2 ,  istype1 = true,  istype2 = false,  istype3=false, istype4=false },
    new dummy { pk = 3 ,  istype1 = false, istype2 = true,   istype3=false, istype4=false },
    new dummy { pk = 4 ,  istype1 = false, istype2 = true,   istype3=false, istype4=false },
    new dummy { pk = 5 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
    new dummy { pk = 6 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
    new dummy { pk = 7 ,  istype1 = false, istype2 = false,  istype3=false, istype4=true  },
    new dummy { pk = 8 ,  istype1 = false, istype2 = false,  istype3=false, istype4=true  },
    new dummy { pk = 9 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
    new dummy { pk = 10 , istype1 = false, istype2 = true,   istype3=false, istype4=false },
    new dummy { pk = 11 , istype1 = false, istype2 = false,  istype3=false, istype4=false }
};

public Form1()
{
    InitializeComponent();
}

private void checkBox_CheckedChanged(object sender, EventArgs e)
{
     dataGridView1.DataSource = Origlist.Where(a => 
         a.istype1 == checkBox1.Checked && 
         a.istype2 == checkBox2.Checked && 
         a.istype3 == checkBox3.Checked && 
         a.istype4 == checkBox4.Checked).ToList();
}
0 голосов
/ 22 мая 2018

Я бы сказал, что самый простой / чистый способ - использовать ADO.NET DataSet для обработки ваших данных вместо использования набора List с некоторым запросом Linq.ADO.NET DataSet - это Официальный образ жизни Winforms .

. Вы можете использовать этот набор данных / datatable с компонентом BindingSource в качестве DataSource вашего DataGridView и использовать свойство Filter String свойства BindingSource.,Это строковое выражение может быть легко построено некоторыми операторами If, проверяющими состояние конкатенации CheckBox и String, следуя синтаксису MSND DataColumn .

Существует несколько других простых способов, таких как расширение класса BindingListс частичной реализацией интерфейса IBindingListView.Но это довольно сложный вопрос, особенно если вы знаете, что Microsoft выполнила эту работу за вас для DataSet ... Эта статья - хорошее место для начала, если вы не боитесь.

0 голосов
/ 22 мая 2018

Попробуйте что-то вроде этого (не проверено):

public partial class Form1 : Form
{
    List<dummy> Origlist = new List<dummy> {
        new dummy { pk = 1 ,  istype1 = true,  istype2  = false, istype3=false, istype4=false },
        new dummy { pk = 2 ,  istype1 = true,  istype2 = false,  istype3=false, istype4=false },
        new dummy { pk = 3 ,  istype1 = false, istype2 = true,   istype3=false, istype4=false },
        new dummy { pk = 4 ,  istype1 = false, istype2 = true,   istype3=false, istype4=false },
        new dummy { pk = 5 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
        new dummy { pk = 6 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
        new dummy { pk = 7 ,  istype1 = false, istype2 = false,  istype3=false, istype4=true },
        new dummy { pk = 8 ,  istype1 = false, istype2 = false,  istype3=false, istype4=true },
        new dummy { pk = 9 ,  istype1 = false, istype2 = false,  istype3=true,  istype4=false },
        new dummy { pk = 10 , istype1 = false, istype2 = true,   istype3=false, istype4=false },
        new dummy { pk = 11 , istype1 = false, istype2 = false,  istype3=false, istype4=false }
    };

    Options options = new Options();

    private class Options {
        public bool istype1 { get; set; }
        public bool istype2 { get; set; }
        public bool istype3 { get; set; }
        public bool istype4 { get; set; }
    }

    public Form1()
    {
        InitializeComponent();
    }

    private void Bind()
    {
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = OrigList.Where(a =>
          (options.istype1 && a.istype1) ||
          (options.istype2 && a.istype2) ||
          (options.istype3 && a.istype3) ||
          (options.istype4 && a.istype4)
        ).ToList();
    }


    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        options.istype1 = checkBox1.checked;
        Bind();
    }



    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    {
        options.istype2 = checkBox2.checked;
        Bind();
    }

    private void checkBox3_CheckedChanged(object sender, EventArgs e)
    {
        options.istype3 = checkBox3.checked;
        Bind();
    }

    private void checkBox4_CheckedChanged(object sender, EventArgs e)
    {
        options.istype4 = checkBox4.checked;
        Bind();
    }

}

Есть и другие способы уменьшить дублирование, но это только начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...