Сделать выборку колонок из DataGridViev

205
27 апреля 2017, 12:33

Очень нужна помощь в задании. Есть на форме DataGridView, в которую считываются данные из базы данных. Мне нужно, чтобы пользователь мог выбрать нужные ему колонки и они выводились вместо изначальной таблицы. Привожу скрин изначальной формы База данных присоединена с помощью DataSet, есть файл класса LINQ to SQL. Строка подключения

public static  linqWorkDataContext db = new linqWorkDataContext();

Пробую такой запрос :

Table<Registr> reg = db.GetTable<Registr>();
if (checkBox1.Checked)
{
    var sumEl = (from s in db.GetTable<Registr>() select s.quantity);
    int sum = 0;
    foreach (var item in sumEl) { sum =+ (int)item; }
    // int sum = sumEl.Sum(n => n.quantity);    
    var amountEl = (from a in db.GetTable<Registr>() select a.amount);
    decimal amount = 0;
    foreach (var i in amountEl) amount =+(decimal)i);
    var v = (from r in db.GetTable<Registr>() select new { r.date, sum, amount }).Distinct();
    registrDataGridView.DataSource = v;
}

Он, можно сказать, не работает. Его результат прилагаю в скрине: Вот такой результат при запросе

            var v = (from r in reg
                     select new
                     {
                         Company = checkBox2.Checked ? r.company : null,
                         Sum = checkBox6.Checked ? (from s in reg select s.quantity).Sum() : null,
                         Amount = checkBox7.Checked ? (from a in reg select a.amount).Sum() : null
                         // аналогично остальные свойства
                     }) registrDataGridView.DataSource = v;

Answer 1

Как я понял, нужно выбирать только определённые колонки. Самым простым способом, пожалуй, будет следующий:

var v = (from r in reg
         select new
         {
             Date = DateCheckBox.Checked ? r.date : null,
             Sum = SumCheckBox.Checked ? (from s in reg select s.quantity).Sum() : null,
             Amount = AmountCheckBox.Checked ? (from a in reg select a.amount).Sum() : null
             // аналогично остальные свойства
         })
         .Distinct();

Это приведёт к тому, что вместо ненужных значений везде будут null. В DataGridView в итоге будет пусто на их месте. Всё как на скриншоте.

Альтернативой будет применение Dynamic Linq. Это позволит более гибко составлять запрос, вообще убирая ненужные колонки, но существенно сложнее для старта.

И, кстати, не делайте DataContext статическим полем. Если в процессе работы произойдёт исключение или просто истечёт таймаут на соединение, то контекст далее станет невозможно использовать.

Рекомендуемой практикой является создание контекста каждый раз, как происходит обращение к БД. Обязательно вызывайте Dispose, а лучше используйте using.

Не стоит волноваться об эффективности: соединение с БД будет установлено при первом обращении и сохранено в пуле соединений. Если что-то произойдёт (истечёт таймаут), то проблем не возникнет: при новом создании контекста будет установлено новое соединение.

READ ALSO
BackgroundWorker и два разных события DoWork

BackgroundWorker и два разных события DoWork

Как в событии DoWork сделать два разных обработчика? У меня есть две задачи которые нужно отображать в прогресс-бар

202
Yii2: GridView &#169; Kartik ссылки с pjax

Yii2: GridView © Kartik ссылки с pjax

Если использовать параметр pjax:

379
Ошибка file_get_contents

Ошибка file_get_contents

Всем доброго времени сутокПытаюсь получить страны через вк АПИ

250
Не могу определиться - PHP [требует правки]

Не могу определиться - PHP [требует правки]

Здравствуйте, подскажите пожалуйста, я решил написать сайт доска объявлений(наподобие как автито, сландо, olx) только не могу опредилиться...

232