I am using my own custom printpreview in which I show basically a Telerik.Windows.Documents.Model.Table.
The table itself stretches to fit the page, but all columns have equal width, but I would like them to fit their content.
I can only assign a PreferredWidth to a distinct TableCell.
Is there a possibility to have the Columns adjust their width to their content?
12 Answers, 1 is accepted
You can set preferred width of a table column by setting PreferredWidth property of corresponding TableGridColumn:
table.Grid.Columns[index].PreferredWidth =
new
TableWidthUnit(TableWidthUnitType.Auto);
Don't hesitate to contact us if you have other questions.
Kind regards,
Boby
the Telerik team

I am using the following extension method to convert a RadGridView to a table to use for printing.
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Telerik.Windows.Controls;
using Telerik.Windows.Documents.Layout;
using Telerik.Windows.Documents.Model;
namespace xyz
{
public static class RadGridViewExtensions
{
public static RadDocument CreateDocument(this RadGridView grid, double width, double height)
{
List<
GridViewBoundColumnBase
> columns = (from c in grid.Columns.OfType<
GridViewBoundColumnBase
>()
orderby c.DisplayIndex
select c).ToList();
Table table = new Table();
table.PreferredWidth = new TableWidthUnit((float)width);
table.LayoutMode = TableLayoutMode.AutoFit;
RadDocument document = new RadDocument();
document.LayoutMode = DocumentLayoutMode.Paged;
document.ParagraphDefaultSpacingAfter = document.ParagraphDefaultSpacingBefore = 0;
document.PageViewMargin = new SizeF(10, 10);
document.SectionDefaultPageMargin = new Padding(0, 0, 0, 0);
if (document.DefaultPageLayoutSettings.Width != (float)width)
document.DefaultPageLayoutSettings.Width = (float)width;
if (document.DefaultPageLayoutSettings.Height != (float)height)
document.DefaultPageLayoutSettings.Height = (float)height;
// This is required so the document can arrange its sub-parts
document.Measure(RadDocument.MAX_DOCUMENT_SIZE);
document.Arrange(new RectangleF(PointF.Empty, document.DesiredSize));
Section section = new Section();
section.Blocks.Add(table);
document.Sections.Add(section);
if (grid.ShowColumnHeaders)
{
TableRow headerRow = new TableRow();
for (int i = 0; i <
columns.Count
(); i++)
{
TableCell
cell
=
new
TableCell();
AddCellValue(cell, columns[i].UniqueName);
cell.PreferredWidth
=
new
TableWidthUnit(TableWidthUnitType.Auto);
headerRow.Cells.Add(cell);
}
table.Rows.Add(headerRow);
}
AddDataRows(table, grid.Items, columns, grid);
return document;
}
private static void AddDataRows(Table table, IList items, IList<GridViewBoundColumnBase> columns, RadGridView grid)
{
for (int i = 0; i < items.Count; i++)
{
TableRow row = new TableRow();
for (int j = 0; j < columns.Count(); j++)
{
TableCell cell = new TableCell();
object value = columns[j].GetValueForItem(items[i]);
AddCellValue(cell, value != null ? value.ToString() : string.Empty);
cell.PreferredWidth = new TableWidthUnit(TableWidthUnitType.Auto);
row.Cells.Add(cell);
}
table.Rows.Add(row);
}
}
private static void AddCellValue(TableCell cell, string value)
{
Paragraph paragraph = new Paragraph();
cell.Blocks.Add(paragraph);
Span span = new Span();
span.Text = value;
span.FontSize = 10;
paragraph.Inlines.Add(span);
}
}
}
The table is created succefully, but all columns have equal size. I tried to set the width as you suggested, but it still does not work :(
Any help is appreciated ;)
Kind regards,
Matthias
Thank you for getting to us with the sample code.
However, I tested it and it seemed to work as expected. Please find attached a demo, which exports the GridView to a RadDocument and shows the document in a RadRichTextBox or shows a print preview right away.
Note that the table columns are resized only when there is a word in one of the columns that needs more space than the current width of the column.
I hope that helps.
Iva
the Telerik team


I am having similar issue using raddocument to export radgridview to pdf or print its content. the columns are narrow and any attempts to change the properties did not work. I even use the sample code you provided to Mathias but same issue. I tried incorporating the following line you pasted but no luck. i am getting index out of range.
table.Grid.Columns[index].PreferredWidth =
new
TableWidthUnit(TableWidthUnitType.Auto);
Could you please modify the sample code to include this line?
Regards,
Tchapo.
Could you please verify that index is not bigger than the count of the columns in the table? if this doesn't help, could you please send us a sample project that reproduces the problem, or at least share more details about your scenario and the stack trace of the exception?
Regards, Boby
the Telerik team

Hi Boby,
The index is not bigger than the columns count of the table.
The code I am using is nearly the same as the one posted by Matthias and is added below.
The RadGridView I am trying to print or export to PDF has about 25 columns. When I remove most of the columns and only keep a couple, the PDF or printed page return a somewhat correct column width, but not when I attempt the pass all the 25 columns.
Thanks for taking your time to help.
Regards,
Tchapo
private
void
ExportToPDF_Click(
object
sender, System.Windows.RoutedEventArgs e)
{
SaveFileDialog dialog =
new
SaveFileDialog();
dialog.DefaultExt =
"*.pdf"
;
dialog.Filter =
"Adobe PDF Document (*.pdf)|*.pdf"
;
if
(dialog.ShowDialog() ==
true
)
{
RadDocument document = CreateDocument(ReportGridView);
document.LayoutMode = DocumentLayoutMode.Paged;
document.Measure(RadDocument.MAX_DOCUMENT_SIZE);
document.Arrange(
new
RectangleF(PointF.Empty, document.DesiredSize));
PdfFormatProvider provider =
new
PdfFormatProvider();
using
(Stream output = dialog.OpenFile())
{
provider.Export(document, output);
}
}
}
private
void
Print_Click(
object
sender, System.Windows.RoutedEventArgs e)
{
Dispatcher.BeginInvoke((Action)(() =>
{
RadRichTextBox1.Document = CreateDocument(ReportGridView);
}));
RadRichTextBox1.Print(
"MyDocument"
, Telerik.Windows.Documents.UI.PrintMode.Native);
}
private
RadDocument CreateDocument(RadGridView grid)
{
List<GridViewBoundColumnBase> columns = (from c
in
grid.Columns.OfType<GridViewBoundColumnBase>()
orderby c.DisplayIndex
select c).ToList();
Table table =
new
Table();
table.PreferredWidth =
new
TableWidthUnit(TableWidthUnitType.Auto);
table.LayoutMode = TableLayoutMode.AutoFit;
RadDocument document =
new
RadDocument();
document.LayoutMode = DocumentLayoutMode.Paged;
document.ParagraphDefaultSpacingAfter = document.ParagraphDefaultSpacingBefore = 0;
document.PageViewMargin =
new
SizeF(10, 10);
Section section =
new
Section();
section.Blocks.Add(table);
document.Sections.Add(section);
if
(grid.ShowColumnHeaders)
{
TableRow headerRow =
new
TableRow();
if
(grid.GroupDescriptors.Count() > 0)
{
TableCell indentCell =
new
TableCell();
indentCell.PreferredWidth =
new
TableWidthUnit(grid.GroupDescriptors.Count() * 20);
//indentCell.Background = HeaderBackgroundPicker.SelectedColor;
headerRow.Cells.Add(indentCell);
}
for
(
int
i = 0; i < columns.Count(); i++)
{
TableCell cell =
new
TableCell();
//cell.Background = HeaderBackgroundPicker.SelectedColor;
AddCellValue(cell, columns[i].UniqueName);
cell.PreferredWidth =
new
TableWidthUnit((
float
)columns[i].ActualWidth);
headerRow.Cells.Add(cell);
}
table.Rows.Add(headerRow);
}
if
(grid.Items.Groups !=
null
)
{
for
(
int
i = 0; i < grid.Items.Groups.Count(); i++)
{
AddGroupRow(table, grid.Items.Groups[i]
as
QueryableCollectionViewGroup, columns, grid);
}
}
else
{
AddDataRows(table, grid.Items, columns, grid);
}
return
document;
}
private
void
AddDataRows(Table table, IList items, IList<GridViewBoundColumnBase> columns, RadGridView grid)
{
for
(
int
i = 0; i < items.Count; i++)
{
TableRow row =
new
TableRow();
if
(grid.GroupDescriptors.Count() > 0)
{
TableCell indentCell =
new
TableCell();
indentCell.PreferredWidth =
new
TableWidthUnit(grid.GroupDescriptors.Count() * 20);
//indentCell.Background = RowBackgroundPicker.SelectedColor;
row.Cells.Add(indentCell);
}
for
(
int
j = 0; j < columns.Count(); j++)
{
TableCell cell =
new
TableCell();
object
value = columns[j].GetValueForItem(items[i]);
AddCellValue(cell, value !=
null
? value.ToString() :
string
.Empty);
cell.PreferredWidth =
new
TableWidthUnit((
float
)columns[j].ActualWidth);
//cell.Background = RowBackgroundPicker.SelectedColor;
row.Cells.Add(cell);
}
table.Rows.Add(row);
}
}
private
void
AddGroupRow(Table table, QueryableCollectionViewGroup group, IList<GridViewBoundColumnBase> columns, RadGridView grid)
{
TableRow row =
new
TableRow();
int
level = GetGroupLevel(group);
if
(level > 0)
{
TableCell cell =
new
TableCell();
cell.PreferredWidth =
new
TableWidthUnit(level * 20);
//cell.Background = GroupHeaderBackgroundPicker.SelectedColor;
row.Cells.Add(cell);
}
TableCell aggregatesCell =
new
TableCell();
//aggregatesCell.Background = GroupHeaderBackgroundPicker.SelectedColor;
aggregatesCell.ColumnSpan = columns.Count() + (grid.GroupDescriptors.Count() > 0 ? 1 : 0) - (level > 0 ? 1 : 0);
AddCellValue(aggregatesCell, group.Key !=
null
? group.Key.ToString() :
string
.Empty);
foreach
(AggregateResult result
in
group.AggregateResults)
{
AddCellValue(aggregatesCell, result.FormattedValue !=
null
? result.FormattedValue.ToString() :
string
.Empty);
}
row.Cells.Add(aggregatesCell);
table.Rows.Add(row);
if
(group.HasSubgroups)
{
for
(
int
i = 0; i < group.Subgroups.Count(); i++)
{
AddGroupRow(table, group.Subgroups[i]
as
QueryableCollectionViewGroup, columns, grid);
}
}
else
{
for
(
int
i = 0; i < group.ItemCount; i++)
{
AddDataRows(table, group.Items, columns, grid);
}
}
}
private
void
AddCellValue(TableCell cell,
string
value)
{
try
{
Paragraph paragraph =
new
Paragraph();
cell.Blocks.Add(paragraph);
Span span =
new
Span();
span.Text = value;
paragraph.Inlines.Add(span);
}
catch
(Exception e)
{
string
msg = e.Message;
}
}
private
int
GetGroupLevel(IGroup group)
{
int
level = 0;
IGroup parent = group.ParentGroup;
while
(parent !=
null
)
{
level++;
parent = parent.ParentGroup;
}
return
level;
}
What version of the controls are you using? I tried several versions and was not able to reproduce the exception issue.
With regard to the column width, it cannot be helped that it is small, since there are so much columns in the document. What you can do (if it fits your scenario) is to change the page size and page orientation. This can be done in the following way:
document.DefaultPageLayoutSettings =
new
PageLayoutSettings(PaperTypes.A2);
document.SectionDefaultPageOrientation = PageOrientation.Landscape;
In order to be able to assist you further, we would need a repro project. If you would like to submit one, you can do so by opening up a support ticket of type "General Feedback" and attaching the project there. All the best,
Iva
the Telerik team
Register for the Q2 2011 What's New Webinar Week. Mark your calendar for the week starting July 18th and book your seat for a walk through of all the exciting stuff we will ship with the new release!

Thanks Iva!
Setting document.DefaultPageLayoutSettings
=
new
PageLayoutSettings(PaperTypes.A2);
helped a lot. The columns are now of varying width and the text is still
wrapped up a little bit, but the overall look is much better. Using A1 instead
of A2 gives the best look in pdf but then printed text is too small on regular
8.5x11.
For
now it is not bad, but could be better. I may have to submit a sample project
depending on the feedback I get from users.
Regards,
Tchapo.

I have a problem with PDF export. My problem is that I have a lot of columns, I mean the amount of RadGridView columns is created dinamically, for example I have the following data:
Column1 Column2 Column3 Column4 Column5 Column6 Column7 ................ ColumnN
data10 data20 data30 data40 data50 data60 data70 ................. dataN0
data11 data21 data31 data41 data51 data61 data71 ................. dataN1
data12 data22 data32 data42 data52 data62 data72 ................. dataN2
data13 data23 data33 data43 data53 data63 data73 ................. dataN3
At this point all the data are being set to the page. It's exporting something like this.
C C C ...............................
o o o
l l l
u u u
m m m
n n n
1 2 3
All the data is being exporting in that way. So, I'd like to have this format.
Column1 Column2 Column3
data10 data20 data30
data11 data21 data31 Page1
data12 data22 data32
data13 data23 data33
Column4 Column5 Column6
data40 data50 data60
data41 data51 data61 Page2
data42 data52 data62
data43 data53 data63
Column7 ................ ColumnN
data70 ................. dataN0
data71 ................. dataN1 Page3
data72 ................. dataN2
data73 ................. dataN3
Is there any way that can do this operation automatically? do you have any suggestion or examples about this using DadDocument, and PdfFormatProvider?
Please! I need your help!!
Note: I attached the report that was exported with my app.
Thanks in advance!!
There are two possible solutions:
- Set large PageSIze to the document, so that the generated table has more space.
- Modify the logic of the export to "break" the table into several smaller tables. My suggestion is to try measuring the columns of your RadGridView and basically create separate tables from small sets of columns (as demonstrated in your example below). What you should be aware in this regard is that RadDocument's model does not allow consecutive tables, so you should make sure to add at least one empty paragraph between them.
I hope this is helpful!
Regards,
Petya
Telerik
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>

As you mentioned, my first approach in order to fix this issue was Set large PageSize as you can see in the attached document. So, now I am trying the second approach that is as you mentioned. I'm modifying the logic of the export.
Thank you for your suggestion!!