Hi,
I use GridView and custom cell element, however it is wrong to display, please help me to resolve it!
My code and video demo below
+ Change page size -> scroll -> change form size to normal -> hide to task bar -> re-open from task bar -> wrong
+ video: https://youtu.be/8ytr-AFMzRc
+ my code:
public
partial
class
RadForm1 : Telerik.WinControls.UI.RadForm
{
public
RadForm1()
{
InitializeComponent();
this
.ThemeName =
"TelerikMetro"
;
this
.WindowState = System.Windows.Forms.FormWindowState.Maximized;
var layer1 =
new
TableLayoutPanel();
layer1.Dock = DockStyle.Fill;
layer1.Location =
new
Point(0);
layer1.Margin =
new
Padding(0);
layer1.ColumnCount = 2;
layer1.ColumnStyles.Add(
new
ColumnStyle(SizeType.Absolute, 30F));
layer1.ColumnStyles.Add(
new
ColumnStyle(SizeType.Percent, 100F));
layer1.RowCount = 2;
layer1.RowStyles.Add(
new
RowStyle(SizeType.Absolute, 28F));
layer1.RowStyles.Add(
new
RowStyle(SizeType.Absolute, 0F));
layer1.AutoSize =
true
;
var label =
new
RadLabel();
label.Dock = DockStyle.Fill;
label.Text = @
"Test grid view"
;
label.ThemeName =
"TelerikMetro"
;
layer1.Controls.Add(label, 0, 0);
layer1.SetColumnSpan(label, 2);
var radGridView1 =
new
RadGridView
{
Dock = DockStyle.Fill,
AutoGenerateColumns =
false
,
AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill,
ThemeName =
"TelerikMetroTouch"
,
AllowDeleteRow =
false
,
AllowAddNewRow =
false
,
// AllowEditRow = false,
EnableGrouping =
false
,
EnablePaging =
true
,
Margin =
new
Padding(5, 10, 5, 10),
PageSize = 10,
AllowColumnHeaderContextMenu =
false
,
AllowRowHeaderContextMenu =
false
};
radGridView1.CreateCell += RadGridView1_CreateCell;
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 1"
,
"Column 1"
)
{
HeaderText = @
""
,
ReadOnly =
true
,
Width = 280,
AllowSort =
false
,
AllowResize =
false
,
AllowReorder =
false
});
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 2"
,
"Column 2"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 3"
,
"Column 3"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 4"
,
"Column 4"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 5"
,
"Column 5"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 6"
,
"Column 6"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 7"
,
"Column 7"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 8"
,
"Column 8"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 9"
,
"Column 9"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 10"
,
"Column 10"
));
radGridView1.Columns.Add(
new
GridViewMaskBoxColumn(
"col 11"
,
"Column 11"
));
RenderData(radGridView1);
GridViewUpdateHeight(radGridView1);
var layer2 =
new
TableLayoutPanel();
layer2.Dock = DockStyle.Fill;
layer2.Location =
new
Point(0);
layer2.Margin =
new
Padding(0);
layer2.ColumnCount = 1;
layer2.ColumnStyles.Add(
new
ColumnStyle(SizeType.Percent, 100F));
layer2.RowCount = 1;
layer2.RowStyles.Add(
new
RowStyle(SizeType.Absolute, radGridView1.Height));
layer2.AutoSize =
true
;
layer2.Controls.Add(radGridView1, 0, 0);
layer1.Controls.Add(layer2, 1, 1);
layer1.RowStyles[1].SizeType = SizeType.AutoSize;
Controls.Add(layer1);
}
private
void
GridViewUpdateHeight(RadGridView grid)
{
var actualRowCount = grid.RowCount < grid.PageSize ? grid.RowCount : grid.PageSize;
var height = actualRowCount * 40;
if
(grid.AllowAddNewRow && !grid.ReadOnly)
{
height += grid.MasterView.TableAddNewRow.GetActualHeight(grid.TableElement);
}
if
(grid.EnableFiltering)
{
height += grid.MasterView.TableFilteringRow.GetActualHeight(grid.TableElement);
}
if
(grid.ShowColumnHeaders)
{
height += grid.MasterView.TableHeaderRow.GetActualHeight(grid.TableElement);
}
if
(grid.EnablePaging)
{
height += 50;
}
height += 20;
// horizontal scroll bar height
grid.Height = height;
}
private
void
RenderData(RadGridView radGridView1)
{
for
(
int
k = 0; k < 100; k++)
{
GridViewDataRowInfo rowInfo =
new
GridViewDataRowInfo(radGridView1.MasterView);
rowInfo.Height = 40;
for
(
int
i = 1; i < radGridView1.Columns.Count; i++)
{
rowInfo.Cells[i].Value =
"Row: "
+ k +
" - column: "
+ i;
}
radGridView1.Rows.Add(rowInfo);
}
}
private
void
RadGridView1_CreateCell(
object
sender, GridViewCreateCellEventArgs e)
{
if
(e.Row
is
GridFilterRowElement)
return
;
if
(e.Column.Index == 0)
{
if
(e.Row
is
GridTableHeaderRowElement && e.CellType ==
typeof
(GridHeaderCellElement))
{
e.CellElement =
new
PageSizeDropdownHeaderCellElement(e.Column, e.Row);
}
if
(e.Row
is
GridDataRowElement)
{
var actionCellElement =
new
ActionCellElement(e.Column, e.Row);
e.CellElement = actionCellElement;
}
}
}
}
public
sealed
class
PageSizeDropdownHeaderCellElement : GridHeaderCellElement
{
public
PageSizeDropdownHeaderCellElement(GridViewColumn col, GridRowElement row) :
base
(col, row)
{
TextAlignment = ContentAlignment.TopCenter;
Alignment = ContentAlignment.TopCenter;
AutoSizeMode = RadAutoSizeMode.FitToAvailableSize;
}
private
RadDropDownListElement _dropDownListElement;
protected
override
void
CreateChildElements()
{
base
.CreateChildElements();
if
(_dropDownListElement?.DataSource ==
null
)
{
_dropDownListElement =
new
RadDropDownListElement();
_dropDownListElement.BindingContext =
new
BindingContext();
_dropDownListElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDownList;
_dropDownListElement.Items.Clear();
_dropDownListElement.Items.Add(
new
RadListDataItem(
"10"
, 10) { Selected =
true
});
_dropDownListElement.Items.Add(
new
RadListDataItem(
"25"
, 25));
_dropDownListElement.Items.Add(
new
RadListDataItem(
"50"
, 50));
_dropDownListElement.Items.Add(
new
RadListDataItem(
"100"
, 100));
_dropDownListElement.Items.Add(
new
RadListDataItem(
"All"
, -1));
_dropDownListElement.Margin =
new
Padding(15, 0, 0, 0);
_dropDownListElement.StretchHorizontally =
true
;
_dropDownListElement.NotifyParentOnMouseInput =
false
;
_dropDownListElement.Popup.MouseClick -= Popup_MouseClick;
_dropDownListElement.Popup.MouseClick += Popup_MouseClick;
_dropDownListElement.PopupClosed -= _dropDownListElement_PopupClosed;
_dropDownListElement.PopupClosed += _dropDownListElement_PopupClosed;
_dropDownListElement.FitToSizeMode = RadFitToSizeMode.FitToParentPadding;
_dropDownListElement.AutoSizeMode = RadAutoSizeMode.FitToAvailableSize;
_dropDownListElement.AutoSize =
true
;
this
.Children.Add(_dropDownListElement);
}
}
private
RadListVisualItem _elementUnderMouse;
private
void
Popup_MouseClick(
object
sender, MouseEventArgs e)
{
_elementUnderMouse = _dropDownListElement.Popup.ElementTree.GetElementAtPoint(e.Location)
as
RadListVisualItem;
}
private
void
_dropDownListElement_PopupClosed(
object
sender, RadPopupClosedEventArgs args)
{
if
(_elementUnderMouse ==
null
)
{
return
;
}
if
(_dropDownListElement.SelectedIndex == -1)
return
;
var pageSize = Convert.ToInt32(_elementUnderMouse.Data.Value);
if
(pageSize == -1)
{
pageSize = GridControl.RowCount < 1000 ? 1000 : GridControl.RowCount;
}
// Backup selected pageSize and re-select when re-render grid view
RowInfo.Tag = pageSize;
GridControl.PageSize = pageSize;
_elementUnderMouse =
null
;
}
protected
override
void
SetContentCore(
object
value)
{
if
(_dropDownListElement !=
null
&& RowInfo?.Tag !=
null
)
{
this
._dropDownListElement.SelectedValue = (
int
)RowInfo.Tag;
}
}
public
override
bool
IsCompatible(GridViewColumn data,
object
context)
{
return
context
is
GridTableHeaderRowElement;
}
protected
override
Type ThemeEffectiveType =>
typeof
(GridHeaderCellElement);
}
public
sealed
class
ActionCellElement : GridDataCellElement
{
#region Public Delegates
public
delegate
void
EventHandler(
object
sender, EventArgs e);
#endregion Public Delegates
#region Public Events
public
event
EventHandler OnSelectedRecord;
public
event
EventHandler OnUnSelectedRecord;
#endregion Public Events
#region Private Fields
public
GridViewCheckBoxElement CheckBoxElement;
public
RadButtonElement BtnFlag;
public
RadButtonElement BtnTimeCircle;
#endregion Private Fields
private
readonly
RadOffice2007ScreenTipElement _screenTip;
#region Public Constructors
public
ActionCellElement(GridViewColumn column, GridRowElement row) :
base
(column, row)
{
Name =
"ActionCell_"
+ RowIndex;
Text =
string
.Empty;
_screenTip =
new
RadOffice2007ScreenTipElement();
_screenTip.MainTextLabel.Padding =
new
Padding(2);
_screenTip.CaptionLabel.Padding =
new
Padding(2);
_screenTip.CaptionLabel.Text = @
"<html><color=red>Created Date"
;
BtnTimeCircle.ScreenTip = _screenTip;
}
#endregion Public Constructors
public
void
SetFlagImage(GridViewRowInfo rowInfo =
null
)
{
if
(rowInfo !=
null
)
{
RowInfo = rowInfo;
}
}
#region Protected Methods
protected
override
SizeF ArrangeOverride(SizeF finalSize)
{
SizeF size =
base
.ArrangeOverride(finalSize);
RectangleF clientRect = GetClientRectangle(finalSize);
float
marginX = 4;
float
width = clientRect.Width - (Children.Count + 1) * 4;
foreach
(RadElement element
in
this
.Children)
{
var btnWidth = width / Children.Count;
element.Arrange(
new
RectangleF(
marginX,
clientRect.Top + 2,
btnWidth,
clientRect.Height - 4));
marginX += btnWidth + 4;
}
return
size;
}
protected
override
void
CreateChildElements()
{
BtnFlag =
new
GridViewButtonElement(GetChildElementName(
"btnFlag"
), Resources.USDA_icon_RedFlag);
BtnTimeCircle =
new
GridViewButtonElement(GetChildElementName(
"btnTimeCircle"
), Resources.USDA_icon_TimeCircle);
CheckBoxElement =
new
GridViewCheckBoxElement(GetChildElementName(
"chkBoxItem"
));
CheckBoxElement.ToggleState = ToggleState.Off;
CheckBoxElement.AutoSizeMode = RadAutoSizeMode.FitToAvailableSize;
BtnTimeCircle.AutoSizeMode = RadAutoSizeMode.FitToAvailableSize;
BtnFlag.AutoSizeMode = RadAutoSizeMode.FitToAvailableSize;
Children.Clear();
Children.Add(CheckBoxElement);
Children.Add(BtnFlag);
Children.Add(BtnTimeCircle);
}
#endregion Protected Methods
#region Private Methods
private
string
GetChildElementName(
string
elementName)
{
return
elementName;
}
#endregion Private Methods
}
public
sealed
class
GridViewCheckBoxElement : RadCheckBoxElement
{
public
bool
MultiSelect {
get
;
set
; }
public
GridViewCheckBoxElement(
string
name,
string
text =
null
)
{
DisplayStyle = DisplayStyle.Text;
Name = name;
Text = text;
Alignment = ContentAlignment.MiddleCenter;
ShowBorder =
false
;
BackColor = Color.White;
CheckAlignment = ContentAlignment.MiddleCenter;
TextAlignment = ContentAlignment.MiddleCenter;
MultiSelect =
false
;
}
}
public
sealed
class
GridViewButtonElement : RadButtonElement
{
public
GridViewButtonElement(
string
name, Image image =
null
,
string
text =
null
)
{
if
(image !=
null
)
{
Image = ResizeImage(image, 25, 25);
ImageAlignment = ContentAlignment.MiddleCenter;
}
DisplayStyle = image !=
null
&&
string
.IsNullOrWhiteSpace(text)
? DisplayStyle.ImageAndText
: image !=
null
? DisplayStyle.Image
: DisplayStyle.Text;
Name = name;
Text = text;
Alignment = ContentAlignment.MiddleCenter;
ShowBorder =
false
;
BackColor = Color.White;
}
private
Bitmap ResizeImage(Image image,
int
width,
int
height)
{
var destRect =
new
Rectangle(0, 0, width, height);
var destImage =
new
Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using
(var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using
(var wrapMode =
new
ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return
destImage;
}
}
Thanks,
Paul.