Очень нужна помощь в задании. Есть на форме 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;
Как я понял, нужно выбирать только определённые колонки. Самым простым способом, пожалуй, будет следующий:
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
.
Не стоит волноваться об эффективности: соединение с БД будет установлено при первом обращении и сохранено в пуле соединений. Если что-то произойдёт (истечёт таймаут), то проблем не возникнет: при новом создании контекста будет установлено новое соединение.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как в событии DoWork сделать два разных обработчика? У меня есть две задачи которые нужно отображать в прогресс-бар
Здравствуйте, подскажите пожалуйста, я решил написать сайт доска объявлений(наподобие как автито, сландо, olx) только не могу опредилиться...