- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否可以仅打印 DataGridView
中具有值的行中的列并排除非空列?我正在尝试打印其中存储有实际值的那些,但现在它正在打印所有这些。
这是实际打印文档的屏幕截图(另存为 pdf):http://imgur.com/HiF9heq
我想删除其余的空列。
这是我要打印的代码和填充数据表的代码:
private void Printdoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
try
{
qbcDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// set the left margin of the document to be printed
int leftMargin = e.MarginBounds.Left;
// set the top margin of the document to be printed
int topMargin = e.MarginBounds.Top;
// variable to determine if more pages are to be printed
bool printMore = false;
// temp width
int tmpWidth = 0;
// for the first page to print, set the cell width and header height
if (firstPage)
{
foreach (DataGridViewColumn gridCol in qbcDataGridView.Columns)
{
tmpWidth = (int)(Math.Floor((double)gridCol.Width /
totalWidth * totalWidth *
((double)e.MarginBounds.Width / totalWidth)));
headerHeight = (int)(e.Graphics.MeasureString(gridCol.HeaderText, gridCol.InheritedStyle.Font, tmpWidth).Height) + 2;
// save the width and height of the headers
arrayLeftColumns.Add(leftMargin);
arrayColWidths.Add(tmpWidth);
leftMargin += tmpWidth;
}
}
// loop until all of the grid rows get printed
while (row <= qbcDataGridView.Rows.Count - 1)
{
DataGridViewRow gridRow = qbcDataGridView.Rows[row];
// set the cell height
cellHeight = gridRow.Height + 5;
int count = 0;
// check to see if the current page settings allow more rows to print
if (topMargin + cellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
{
newPage = true;
firstPage = false;
printMore = true;
break;
}
else
{
if (newPage)
{
// draw the header
e.Graphics.DrawString("QBC Directory",
new Font(qbcDataGridView.Font, FontStyle.Bold),
Brushes.Black, e.MarginBounds.Left,
e.MarginBounds.Top - e.Graphics.MeasureString("QBC Directory",
new Font(qbcDataGridView.Font, FontStyle.Bold),
e.MarginBounds.Width).Height - 13);
// set the data (now) and the current time
String date = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString();
// draw the date on the print document
e.Graphics.DrawString(date,
new Font(qbcDataGridView.Font, FontStyle.Bold),
Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(date,
new Font(qbcDataGridView.Font, FontStyle.Bold),
e.MarginBounds.Width).Width),
e.MarginBounds.Top - e.Graphics.MeasureString("QBC Directory", new Font(new Font(qbcDataGridView.Font, FontStyle.Bold),
FontStyle.Bold), e.MarginBounds.Width).Height - 13);
// draw the column headers
topMargin = e.MarginBounds.Top;
foreach (DataGridViewColumn gridCol in qbcDataGridView.Columns)
{
if (!string.IsNullOrEmpty(gridCol.HeaderText))
{
// header color
e.Graphics.FillRectangle(new SolidBrush(Color.LightGray),
new Rectangle((int)arrayLeftColumns[count], topMargin,
(int)arrayColWidths[count], headerHeight));
// header text box
e.Graphics.DrawRectangle(Pens.Black,
new Rectangle((int)arrayLeftColumns[count], topMargin,
(int)arrayColWidths[count], headerHeight));
// header string
e.Graphics.DrawString(gridCol.HeaderText,
gridCol.InheritedStyle.Font, new SolidBrush(gridCol.InheritedStyle.ForeColor),
new RectangleF((int)arrayLeftColumns[count], topMargin, (int)arrayColWidths[count], headerHeight), string_format);
}
else
{
break;
}
count++;
}
newPage = false;
topMargin += headerHeight;
}
count = 0;
// draw the column's contents
foreach (DataGridViewCell gridCell in gridRow.Cells)
{
if (gridCell.Value != null)
{
if (!string.IsNullOrEmpty(gridCell.Value.ToString()))
{
e.Graphics.DrawString(gridCell.Value.ToString(),
gridCell.InheritedStyle.Font, new SolidBrush(gridCell.InheritedStyle.ForeColor),
new RectangleF((int)arrayLeftColumns[count], topMargin, (int)arrayColWidths[count], cellHeight), string_format);
}
else
{
break;
}
}
else
{
break;
}
// draw the borders for the cells
e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)arrayLeftColumns[count], topMargin, (int)arrayColWidths[count], cellHeight));
count++;
}
}
row++;
topMargin += cellHeight;
// if more lines exist, print another page
if (printMore)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
和填充 DataGridView
的菜单条项:
private void MenuViewMembers_Click(object sender, EventArgs e)
{
qbcDataGridView.Font = new Font(qbcDataGridView.Font.FontFamily, 10);
qbcDataGridView.Location = new Point(30, 100);
qbcDataGridView.Size = new Size(1500, 500);
dbConn.Open();
DataTable dt = new DataTable();
DbAdapter = new OleDbDataAdapter("select ID, household_head, birthday, phone, email, address, status, spouse, spouse_birthday, spouse_email, anniversary, spouse_status," +
"child1, child1_birthday, child1_email, child2, child2_birthday, child3_birthday, child4, child4_birthday, child4_email, child5, child5_birthday, child5_email," +
"child6, child6_birthday, child6_email, child7, child7_birthday, child7_email from members", dbConn);
DbAdapter.Fill(dt);
qbcDataGridView.DataSource = dt;
qbcDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
qbcDataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
qbcDataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dbConn.Close();
Controls.Add(qbcDataGridView);
}
我认为如果只打印非空值,它将正确格式化打印文档(见屏幕截图)。
如有任何帮助,我们将不胜感激。
谢谢!
更新 - 我明白了,所以没有显示空单元格(http://imgur.com/R0ueyft),但我想我的另一个问题是如果单元格为空,如何不显示列标题。我更新了我的代码以反射(reflect)我所做的更改。
最佳答案
用数据填充 DataTable 后,遍历列并删除空列。
DbAdapter.Fill(dt);
for (int i = dt.Columns.Count - 1; i >= 0; i--)
{
if (dt.AsEnumerable().All(row => row[i].ToString() == ""))
{
dt.Columns.RemoveAt(i);
}
}
qbcDataGridView.DataSource = dt;
关于c# - 仅打印具有来自数据 GridView 的值的行中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864219/
有没有更好的方法用 PHP 将数据输出到 html 页面? 如果我想在 php 中用一些 var 制作一个 div,我会写类似的东西 print (''.$var.''); 或 echo "''.$v
我可以使用 java awt print 来打印文档/文件而不是使用 javax print 吗?我发现在 java awt print 中有一个选项可以使用 AttributedString 将内容
目前我通过以下方式运行 R 脚本: R --slave argument1 argument2 ... 我想知道 R 中关于如何退出脚本并发出警告的最佳实践,q() 会这样做吗? if(!file.
谁能告诉我如何编写一个程序,用 gcc 编译时打印 c ,用 g++ 编译时打印 c++? 最佳答案 #ifdef __cplusplus printf("c++\n"); #else
我需要支持在 KitKat 设备上打印,但我的目标 SDK 是 13(无法更改)。 特别是我需要打印一个 webview。 这是用于打印 webview 的 API: http://developer
我正在尝试创建一个简单的函数,其中 python 将根据您的年份输入计算年龄。我已经尝试了几种方法,但我没有运气 atm。 附:对不起,我是新手。 ame = input(" Enter your n
JavaFX 2.0 是否支持打印?我有一个文本区域,我从中获取文本然后我想打印它,但似乎没有这个功能。 当然,这里我说的是打印到打印机。 :) 最佳答案 尚不支持。作为一种解决方法,您可以使用 Ja
我试图找出printOn的重点。我查看了一些实现它的类,看起来它只是帮助打印不同数据类型的单位。这是准确的吗? 如果是这样,有人能指出我如何为我自己的类(class)实现这一点的正确方向吗?我将在可能
我无法让 IE 打印我的 Canvas (使用 excanvas 生成)...我使用的是最新版本的 excanvas。 http://dl.dropbox.com/u/997831/canvas.ht
我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的: void ctrlZHandler(int sig_num) { //SIGTSTP-18
我有兴趣打印一系列查询。我有以下代码。 start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764) end = datetime.datetime(201
public class javaClass { public static void main(String [] arg) { String row1 = "A____A"
我需要写入前一行的命令,例如不带\n 的 print()。 下面是一些示例代码: a=0 print("Random string value") if a==0: print_to_prev
我有一个使用 UIKit 和 Objective C 的旧 iOS 应用程序,我目前正在将其移植到 SwiftUI 和 Swift。一切都很顺利,我喜欢 Swift 和 SwiftUI。该应用程序已经
我创建了一个求和函数,它接受一个开始编号和一个结束编号,并返回这两点之间的总和答案 def print_sum_equations(start_number,end_number):
在 Perl 6 中,print 和有什么区别? , put和 say ? 我怎么看 print 5不同,但 put 5和 say 5看起来一样。 最佳答案 put $a就像 print $a.Str
我正在使用 here 中的 getOrgChart 库,我正在尝试打印整个图表,而不仅仅是可见部分。不幸的是,当使用标准库打印功能时,它只会打印出第一部分,而我不知道如何打印整个图表(该图表相当宽,大
我制作了一个非常适合 A4 页面的 View 。现在我想打印它。请注意,我没有使用drawRect或类似的东西,只是一个带有 subview 和文本标签的普通 View 。我的问题是,我对该 View
由于 Cocoa-Java 已弃用,我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是: NSImage *image =
这个问题已经有答案了: Printing a TDBGrid (4 个回答) 已关闭 6 年前。 如何在不安装或下载组件的情况下打印 DBGrid? 或者 如何将 DBGrid 的数据放入 RichE
我是一名优秀的程序员,十分优秀!