У меня есть форма AdvancedSearchForm
с элементом управления DataGridView dgrData
и кнопкой Report
в C # Winform. При нажатии кнопки Report
я хочу, чтобы форма с элементом управления ReportView отображалась с теми же столбцами, что и в DataGridView, с теми же заголовками столбцов.
Форма с DataGridView и кнопкой
Ожидаемый результат при нажатии кнопки «Отчет»:
Мой элемент управления DatagridView (dgrData
) связан с
- SQL
“Select Id, c_Name from Country”
- ConnectionString
server=localhost;User Id=root;password=root;Persist Security Info=True;database=country_state
Чтобы загрузить данные в сетку во время выполнения, я готовлю следующий DataAdapter:
DataAdapter dataAdapter = DataAdapter.Current;
// I am passing the SQL statement and the table name to my database which knows the ConnectionString within the LoadData function
DataTable dt0 = dataAdapter.LoadData("select Id, c_Name from `country`", "country");
if (dt0 != null) {
dgrData.DataSource = dt0;
}
Можно ли вызвать дочернюю форму, содержащую элемент управления reportviewer по умолчанию, который показывает отчет с таблицей, содержащей столбцы, соответствующие datagridview (dgrData
) вместе с данными динамически во время выполнения?
Подробные сведения об ожидаемых результатах:
- При нажатии кнопки средство просмотра отчетов в целевой форме должно получить
, связанный с источником данных из значений в DataGridView. Таким образом, элемент управления ReportViewer ничего не знает о данных в отчете, пока пользователь не нажмет кнопку «Отчет» во время выполнения. - Я хочу, чтобы решение не требовало создания отдельного файла RDLC, потому что оно вызывает внешнюю зависимость, чтобы остановить текущий поток и создать файл отчета в конструкторе файлов отчетов, который может быть чрезмерным для пользователей.
- Я ничего не знаю о конструкторе RDLC и связанном с ним источнике данных (я готов изучить (^ _ ^), но я не могу заставить мою команду выполнять это требование к обучению) и привязать данные к отчету. Буду признателен за рабочие примеры кодирования, если ваша помощь содержит теорию.
- Я знаю, что ReportViewer существует уже довольно давно. Желаю, чтобы пример решения для сопоставления данных 1-1 между сеткой данных и ReportViewer было легче найти для кого-то в будущем на SO.
Примечание. Пожалуйста, дайте мне знать, если с моей стороны потребуются какие-либо дополнительные данные, в комментариях. Чтобы показать текущее решение, мне пришлось создать файл RDLC, в который я должен был поместить строку подключения и SQL во время разработки, чего я хочу избежать в решении, которое я ищу. Я хочу найти решение, в котором файл RDLC создается с помощью некоторого модульного кода, который можно использовать и в других решениях, вместо того, чтобы разрабатывать его для каждой формы, в которой у меня есть DataGrids.
tt
работает как шаблон. Он преобразует все строки вWriter.Write("...")
методы и смешиваетC#
код, который мы использовали вtt
. Затем в результате создается классC#
, который имеет несколько методов, напримерTransformText
, который создает для нас строковый вывод. Каким-то образом это работает как страницы ASP.NET, в которых вы смешиваете текст и блоки кода C #, или как Razor. Класс C # создается вtt
файле в растворе, и его нельзя трогать. Внесите любые изменения вtt
файл, тогда класс C # изменится. Чтобы узнать больше о шаблонах T4, см. Связанный документ от Microsoft. 02.11.2016foreach
циклы, которые вы видите в файле T4. Чтобы добавить другие элементы, такие как заголовок или нижний колонтитул, или несколько меток для даты, времени и т. Д., Вы должны использовать ту же идею, создать отчет и преобразовать его в такой шаблон T4. 02.11.2016ReportColumns
. Может отличаться отDataGridView
столбцов. Но вы должны предоставить данные для этого столбца. Например, вы можете использовать его так:f.ReportColumns.Add(new ReportColumn("A"));f.ReportColumns.Add(new ReportColumn("B"));
тогда вы можете передатьList
, элементы которого содержат свойстваA
иB
. Например,DataTable
, который создается следующим образом:var dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B"); dt.Rows.Add("1");dt.Rows.Add("2");
, тогда, если вы установитеf.ReportData = dt
, он покажет отчет с этими данными. 02.11.2016Linq
необязательно, но необходимо, и вам не следует избегать использования linq. Код, который я использовал, эквивалентен простому циклуforeach
.var list = new List<ReportColumn>(); foreach(DataGridViewRow x in dataGridView1.Rows){ list.Add(new ReportColumn(x.DataPropertyName) { Title = x.HeaderText, Width = x.Width });}
Тогдаf.ReportColumns = list;
. 02.11.2016reportContent
- это строка, содержащая форматRDLC
. Сохраните его в*.rdlc
файл, затем вы можете просто открыть его в Visual Studio. 02.11.2016HTML
ответ, который я опубликовал здесь, является действительно хорошей отправной точкой для тех, кто хочет создавать выходные данные HTML, но большинство пользователей этого не делает. я не имею никакого представления о шаблонах времени выполнения T4 и не знаю, как это работает, и поскольку ответ почему-то длинный, ответом пренебрегают; но это действительно полезно. 02.11.2016string RDLCCode = System.Text.Encoding.UTF8.GetString(reportContent);
, но могу ли получить схему дизайна? 02.11.2016var reportContent = System.Text.Encoding.UTF8.GetBytes(report.TransformText());
, затемSystem.IO.File.WriteAllText(@"d:\report1.rdlc", reportContent );
02.11.2016