C#PrintPreviewDialog文档设置为TabularReport,但没有显示

时间:2011-10-19 09:02:19

标签: c# printing tabular print-preview

我有一个带有PrintPreviewDialog和TabularReport的表单。 我也有一个DataGridView。

我从DataBase中填充DataView对象。现在没关系,但是它有效。 当我在DataGridView上使用DataView时,我可以看到正确的行和颜色。我使用这段代码:

DataView v = new DataView(dTable);
bindingSource1.DataSource = dTable;
grid.DataSource = bindingSource1;

但是当我在TabularReport上使用相同的DataView然后尝试在我的PrintPreviewDialog中看到它时,我得到一个空页面(除了标题)。我使用此代码:

TabularReport1.DataView = v; // here v is the same DataView from the previous code block above
printPreview1.Document = TabularReport1;
//here of course i also set a button to load printPreview1.ShowDialog()

有谁知道为什么我会得到一个空白页面? 谢谢!

1 个答案:

答案 0 :(得分:0)

您还必须设置表的边距,这里是一个示例代码,如何使用数据设置边距并使用dataview

   DataView m_DataView;
   e.HasMorePages = false;
  for (rowCounter = currentRow; (rowCounter <= (this.DataView.Count - 1)); rowCounter++) 
  {
       float currentRowHeight = PrintDetailRow(leftMargin, currentPosition, this.MinDetailRowHeight, this.MaxDetailRowHeight, width, e, this.DataView(rowCounter), true);
       if ((currentPosition + (currentRowHeight < footerBounds.Y)))
        {
            // it will fit on the page
               currentPosition = (currentPosition + PrintDetailRow(leftMargin, currentPosition, MinDetailRowHeight, MaxDetailRowHeight, width, e, this.DataView(rowCounter), false));
        }
        else
        {
           e.HasMorePages = true;
           currentRow = rowCounter;
           break;
         }

    }


public DataView DataView {
    get {
        return m_DataView;
    }
    set {
        m_DataView = value;
    }
}

protected object GetField(DataRowView row, string fieldName) {
    object obj = null;
    if (!(m_DataView == null)) {
        obj = row(fieldName);
    }
    return obj;
}

// relevant snippet out of OnPrintPage
private int rowCounter;

请看一下more info

的链接

我希望它会帮助你......

这是printdetailrow函数......

   protected virtual float PrintDetailRow(float x, float y, float minHeight, float maxHeight, float width, PrintPageEventArgs e, DataRowView row, bool sizeOnly)
   {
    Graphics g = e.Graphics;
    string detailText;
    RectangleF detailTextLayout = new RectangleF(x, y, width, maxHeight);
    float detailHeight;
    Font detailRowFont;
    StringFormat detailStringFormat = new StringFormat(StringFormatFlags.LineLimit);
    detailStringFormat.Trimming = StringTrimming.EllipsisCharacter;
    ColumnInformation ci;
    int cols;
    for (cols = 0; (cols 
                <= (this.ColumnCount - 1)); cols++)
     {
        // use the provided functions, 
        // instead of going after the internal ArrayList 
        // and the CType() work is taken care of for you.
        ci = this.GetColumn(cols);
        // if a font is not specified, use the DetailFont property of the report class
        if ((ci.DetailFont == null))
        {
            detailRowFont = this.DetailFont;
        }
        else
        {
            detailRowFont = ci.DetailFont;
        }
        detailText = ci.GetString(this.GetField(row, ci.Field));
        detailStringFormat.Alignment = ci.Alignment;
        detailTextLayout.Width = ci.Width;
        if (((detailTextLayout.X - x) 
                    >= width))
        {
            // none of it will fit onto the page
            break;
        }
        else if (((detailTextLayout.X 
                    + (detailTextLayout.Width - x)) 
                    > width))
        {
            // some of it won't fit onto the page
            detailTextLayout.Width = (width 
                        - (detailTextLayout.X - x));
        }
        detailHeight = Math.Max(g.MeasureString(detailText, detailRowFont, detailTextLayout.Size, detailStringFormat, 0, 0).Height, detailHeight);
        // hmm... no space between columns?
        // This code lines the columns up flush, 
        // but if you wished to add a space between 
        // them you would need to add it to X here, 
        // in the check above to determine if the column 
        // will fit, and in the corresponding parts 
        // of the next For loop.
        detailTextLayout.X = (detailTextLayout.X + detailTextLayout.Width);
    }
    detailTextLayout.X = x;
    detailTextLayout.Height = Math.Max(Math.Min(detailHeight, maxHeight), minHeight);
    if (!sizeOnly) {
        for (cols = 0; (cols 
                    <= (this.ColumnCount - 1)); cols++) {
            ci = this.GetColumn(cols);
            if ((ci.DetailFont == null)) {
                detailRowFont = this.DetailFont;
            }
            else {
                detailRowFont = ci.DetailFont;
            }
            detailText = ci.GetString(this.GetField(row, ci.Field));
            detailStringFormat.Alignment = ci.Alignment;
            detailTextLayout.Width = ci.Width;
            if (((detailTextLayout.X - x) 
                        >= width)) {
                // none of it will fit onto the page
                break;
            }
            else if (((detailTextLayout.X 
                        + (detailTextLayout.Width - x)) 
                        > width)) {
                // some of it won't fit onto the page
                detailTextLayout.Width = (width 
                            - (detailTextLayout.X - x));
            }
            g.DrawString(detailText, detailRowFont, DetailBrush, detailTextLayout, detailStringFormat);
            detailTextLayout.X = (detailTextLayout.X + detailTextLayout.Width);
        }
        detailTextLayout.X = x;
        detailTextLayout.Y = y;
        detailTextLayout.Height = detailHeight;
        detailTextLayout.Width = width;
    }
    return detailTextLayout.Height;
}