C # PrintPreviewDialog Документ установлен в TabularReport, но ничего не отображается - PullRequest
0 голосов
/ 19 октября 2011

У меня есть форма с PrintPreviewDialog и TabularReport. У меня также есть DataGridView.

Я заполняю объект DataView из моей базы данных. Не важно, как, но это работает. Когда я использую свой DataView в DataGridView, я вижу правильные строки и столбцы. Я использую этот код:

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

Но когда я использую тот же DataView в моем TabularReport, а затем пытаюсь увидеть его в своем 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 голосов
/ 21 октября 2011

Вы также должны установить поля для таблицы, вот пример кода, как установить поля с данными и используя 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;

Пожалуйста, посмотрите на эту ссылку для больше информации

Я надеюсь, что это поможет вам ....

это функция 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;
}
...