列/行变化时从数据表创建报表

时间:2016-05-24 09:38:07

标签: c# winforms datagridview datatable reportviewer

我已经做了很多搜索,找不到任何有助于我开始解决这个问题的内容,所以会尝试解释我的要求。

我正在将旧版VB6应用程序重写为C#(Windows窗体),这使我们有机会删除未使用的方面,并添加一些新功能。

遗留应用程序能够打印输出,但使用FORTRAN模块来实现这一点 - 我们不想使用这种旧技术,所以我正在寻找一种方法来获取DataGridView的数据源(可以是轻松转换为Datatable)并以结构化格式打印。

导致我在找到如何开发这个问题的示例时遇到问题的唯一问题是列的数量可以在1到10之间变化(如果他们决定增加这个数量,则更多),并且标题是唯一的,因为它们显示精算因子表。

因此,例如,第一行将是一个表名,然后是任意数量的行(从40到95)。

如果数据位于列标题已修复的结构中,则有很多示例,但我找不到任何处理动态列的示例。

应用程序开发已经在进行中,因此我希望使用VS(2012)中内置的ReportViewer,但找不到动态列的任何示例。我需要至少复制旧版本的输出(如果需要可以提供示例),如果没有改进它。

1 个答案:

答案 0 :(得分:0)

以下是如何动态创建列并将其放入DataGridView的快速示例。

var dgv = new DataGridView();

var dgvTextColumn = new DataGridViewTextBoxColumn();
dgvTextColumn.Name = "columnName"; // to use for future column references
dgvTextColumn.DataPropertyName = "columnName"; // I prefer to keep this and .Name property the same
dgvTextColumn.HeaderText = "columnHeader";
dgvTextColumn.Width = 50;
dgvTextColumn.ReadOnly = false;
dgv.Columns.Add(dgvTextColumn);

这是一个非常简单的例子。我个人在数据库表中存储我想要创建的列以及一些基本的列属性,例如width,readonly等。遍历所有列并创建它们迭代上面的代码。这样我可以更新我想要显示的列而无需重新编译应用程序。我还根据要创建的列类型使用case语句分解那些存储的列,以便我可以执行组合,文本,按钮和复选框列。

最重要的是,您必须确保在动态创建的列中DataSourceName存在于您为DataGridView设置的数据源中。

如果您想要更复杂的答案,请与我联系。