Очень нужна помощь в задании. Есть на форме 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.
Не стоит волноваться об эффективности: соединение с БД будет установлено при первом обращении и сохранено в пуле соединений. Если что-то произойдёт (истечёт таймаут), то проблем не возникнет: при новом создании контекста будет установлено новое соединение.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники