Please refer to the attached screenshot.
Workaround:
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Id");
dt.Columns.Add("Name");
for (int i = 0; i < 5; i++)
{
dt.Rows.Add(i, "Item" + i);
}
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.AllowSearchRow = true;
this.radGridView1.SearchRowPosition = Telerik.WinControls.UI.SystemRowPosition.Bottom;
this.radGridView1.ViewDefinition = new CustomTableViewDefition();
}
public class CustomTableViewDefition : TableViewDefinition
{
public override IRowView CreateViewUIElement(GridViewInfo viewInfo)
{
return new CustomTableElement();
}
}
public class CustomTableElement : GridTableElement
{
protected override RowsContainerElement CreateViewElement()
{
return new CustomRowsContainerElement();
}
}
public class CustomRowsContainerElement : RowsContainerElement
{
protected override SizeF ArrangeOverride(SizeF finalSize)
{
float y = 0;
this.TopPinnedRows.Arrange(new RectangleF(0, y, finalSize.Width, this.TopPinnedRows.DesiredSize.Height));
y += this.TopPinnedRows.DesiredSize.Height + ElementSpacing;
this.ScrollableRows.Arrange(new RectangleF(0, y, finalSize.Width, this.ScrollableRows.DesiredSize.Height));
y += this.ScrollableRows.DesiredSize.Height + ElementSpacing;
this.BottomPinnedRows.Arrange(new RectangleF(0, finalSize.Height - this.BottomPinnedRows.DesiredSize.Height,
finalSize.Width, this.BottomPinnedRows.DesiredSize.Height));
return finalSize;
}
}
Repeat the master template headers right after the end of an expanded detail template. The purpose is clarity for the end user.
The issue can be reproduced with the .40 version of the assemblies and in a scenario in which the grid is added as a RadMenuHostItem to the Items collection of a drop-down button.
Workaround: set the BindingContext of the grid to equal that of the form:
public Form1()
{
InitializeComponent();
radGridView1.BindingContext = this.BindingContext;
}
To reproduce:
1. Use the following code:
public Form1()
{
InitializeComponent();
this.radGridView1.EnableFiltering = true;
GridViewDecimalColumn col = new GridViewDecimalColumn();
col.Name = "Calculated Column";
col.HeaderText = "Order value";
radGridView1.Columns.Add(col);
radGridView1.Columns["Calculated Column"].Expression = "Freight/Sum(Freight)";
}
private void Form1_Load(object sender, EventArgs e)
{
this.ordersTableAdapter.Fill(this.nwindDataSet.Orders);
this.radGridView1.DataSource = this.ordersBindingSource;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewSummaryItem summaryItem = new GridViewSummaryItem();
summaryItem.Name = "Freight";
summaryItem.Aggregate = GridAggregateFunction.Sum ;
GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem();
summaryRowItem.Add(summaryItem);
this.radGridView1.SummaryRowsTop.Add(summaryRowItem);
this.radGridView1.SummaryRowsBottom.Add(summaryRowItem);
}
2. Filter the grid by EmployeeID for example. You will notice that the summary item for Freight is recalculated considering the filtered rows. However, the calculated column doesn't update its values.
To reproduce:
- Select several rows and cells in excel and copy them.
- Paste in the self-reference grid.
- Only the first row is copied.
Workaround:
private void RadGridView1_Pasting(object sender, GridViewClipboardEventArgs e)
{
e.Cancel = true;
List<List<string>> rows = this.GetTextData();
PrintGridTraverser traverser = new PrintGridTraverser(this.radGridView1.MasterView);
while (traverser.Current != this.radGridView1.CurrentRow)
{
traverser.MoveNext();
}
traverser.MovePrevious();
int rowIndex = 0;
int colIndex = this.radGridView1.CurrentColumn.Index;
while (traverser.MoveNext() && rowIndex < rows.Count)
{
for (int i = colIndex; i < this.radGridView1.Columns.Count && i - colIndex < rows[rowIndex].Count; i++)
{
traverser.Current.Cells[i].Value = rows[rowIndex][i - colIndex];
}
rowIndex++;
}
}
How to reproduce: check the attached video as well
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.radGridView1.DataSource = this.GetData();
}
private DataTable GetData()
{
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));
dt.Columns.Add("Bool", typeof(bool));
for (int i = 0; i < 10; i++)
{
dt.Rows.Add(i, "Name " + i, DateTime.Now.AddDays(i), i % 2 == 0);
}
return dt;
}
private void radButton1_Click(object sender, EventArgs e)
{
this.radGridView1.TableElement.ScrollToRow(0);
this.radGridView1.Focus();
}
}
Workaround: call the method if the row is not selected
private void radButton1_Click(object sender, EventArgs e)
{
if (!this.radGridView1.Rows[0].IsSelected)
{
this.radGridView1.TableElement.ScrollToRow(0);
}
this.radGridView1.Focus();
}
To reproduce:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products)
Me.CategoriesTableAdapter.Fill(Me.NwindDataSet.Categories)
Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products)
Me.CategoriesTableAdapter.Fill(Me.NwindDataSet.Categories)
RadGridView1.AutoGenerateHierarchy = True
RadGridView1.DataSource = Me.NwindDataSet
RadGridView1.DataMember = "Categories"
End Sub
Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click
Dim style As New GridPrintStyle()
style.PrintHierarchy = True
style.HierarchyIndent = 20
style.ChildViewPrintMode = ChildViewPrintMode.SelectViewToPrint
Me.RadGridView1.PrintStyle = style
Me.RadGridView1.PrintPreview()
End Sub
Please refer to the attached gif file.
Workaround:
Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click
Me.RadGridView1.PrintSettingsDialogFactory = New CustomGridViewPrintSettingsDialogFactory()
Dim style As New GridPrintStyle()
style.PrintHierarchy = True
style.HierarchyIndent = 20
style.ChildViewPrintMode = ChildViewPrintMode.SelectViewToPrint
Me.RadGridView1.PrintStyle = style
Me.RadGridView1.PrintPreview()
End Sub
Public Class CustomGridViewPrintSettingsDialog
Inherits GridViewPrintSettingsDialog
Sub New(document As RadPrintDocument)
MyBase.New(document)
End Sub
Protected Overrides Sub LoadSettings()
MyBase.LoadSettings()
Dim gridView As RadGridView = TryCast(Me.PrintDocument.AssociatedObject, RadGridView)
Me.printStyleSettingControl.PrintStyle.PrintHierarchy =gridView.PrintStyle.PrintHierarchy
End Sub
End Class
Public Class CustomGridViewPrintSettingsDialogFactory
Implements IPrintSettingsDialogFactory
Public Function CreateDialog(document As RadPrintDocument) As Form Implements IPrintSettingsDialogFactory.CreateDialog
Return New CustomGridViewPrintSettingsDialog(document)
End Function
End Class
To reproduce:
public Form1()
{
InitializeComponent();
this.radGridView1.Columns.Add("Name");
this.radGridView1.Columns.Add("ID");
this.radGridView1.RowsChanged += radGridView1_RowsChanged;
}
private void radGridView1_RowsChanged(object sender, GridViewCollectionChangedEventArgs e)
{
Console.WriteLine(e.Action);
if (e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.Add)
{
GridViewRowInfo row = e.NewItems[0] as GridViewRowInfo;
row.Cells["ID"].Value = this.radGridView1.Rows.Count;
}
}
private void radButton1_Click(object sender, EventArgs e)
{
this.radGridView1.Rows.Add("Item" + this.radGridView1.Rows.Count);
}
Note: the first firing of the RowsChanged event used to be with Action=Add.
Note: if you change the image in Windows8 theme for example, the image is successfully applied. Workaround: set the CurrentRowHeaderImage property at run time.
To reproduce
- Set the AutoSize and AutoSizeRows properties to true.
- Start editing a cell.
- Exception occurs.
Workaround:
class MyGrid : RadGridView
{
protected override void OnResize(EventArgs e)
{
//base.OnResize(e);
}
}
To reproduce:
DataTable dt = new DataTable();
public Form1()
{
InitializeComponent();
for (int i = 0; i < 5; i++)
{
dt.Columns.Add("Col" + i);
}
for (int i = 0; i < 5; i++)
{
DataRow row = dt.NewRow();
dt.Rows.Add(row);
foreach (DataColumn col in dt.Columns)
{
row[col.ColumnName] = randomWord(2, 14);
}
}
}
static Random r = new Random();
static string chars = "AEIOUBCDFGHJKLMNPQRSTVWXYZ";
static string randomWord(int minlen, int maxlen)
{
double d1 = minlen + r.NextDouble() * (maxlen - minlen);
int len = (int)d1;
char[] word = new char[len];
for (int i = 0; i < len; ++i)
{
int index = ((int)Math.Round(25 * r.NextDouble() + 0.4999999999));
word[i] = chars[index];
}
return new string(word);
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public Item(int id, string name)
{
this.Id = id;
this.Name = name;
}
}
private void radButton1_Click(object sender, EventArgs e)
{
this.radGridView1.Columns.Clear();
foreach (DataColumn col in dt.Columns)
{
this.radGridView1.Columns.Add(col.ColumnName);
this.radGridView1.Columns.Last().FieldName = col.ColumnName;
}
this.radGridView1.BestFitColumns(BestFitColumnMode.AllCells);
}
private void Form1_Load(object sender, EventArgs e)
{
this.radGridView1.AutoGenerateColumns = false;
this.radGridView1.DataSource = dt;
foreach (DataColumn col in dt.Columns)
{
this.radGridView1.Columns.Add(col.ColumnName);
this.radGridView1.Columns.Last().FieldName = col.ColumnName;
}
this.radGridView1.BestFitColumns(BestFitColumnMode.AllCells);
}
Workaround: clear the GroupDescriptors collection as well and add the GroupDescriptor programmatically: http://docs.telerik.com/devtools/winforms/gridview/grouping/setting-groups-programmatically
Please refer to the attached screenshot.
To reproduce:
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (int i = 0; i < 5; i++)
{
dt.Rows.Add(i, "Item" + i);
}
Random rand = new Random();
DataTable dt2 = new DataTable();
dt2.Columns.Add("Id", typeof(int));
dt2.Columns.Add("Name2", typeof(string));
dt2.Columns.Add("ParentId", typeof(int));
for (int i = 0; i < 20; i++)
{
dt2.Rows.Add(i, "Child Item" + i, rand.Next(0, 5));
}
radGridView1.DataSource = dt;
radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewTemplate template = new GridViewTemplate();
template.DataSource = dt2;
template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
radGridView1.MasterTemplate.Templates.Add(template);
template.Columns["ParentId"].IsVisible = false;
GridViewRelation relation = new GridViewRelation(radGridView1.MasterTemplate);
relation.ChildTemplate = template;
relation.RelationName = "MasterDetail";
relation.ParentColumnNames.Add("Id");
relation.ChildColumnNames.Add("ParentId");
radGridView1.Relations.Add(relation);
this.radGridView1.EnableFiltering = true;
this.radGridView1.ShowFilteringRow = false;
this.radGridView1.ShowHeaderCellButtons = true;
}
Workaround: change the Name property of the column in order to avoid duplicated columns:
template.Columns["Name"].Name = "Name2";
To reproduce: - Add a grid to a form and set the EnableHotTracking property to false in the properties window. - When the application is started the property is reset. Workaround: Set the property at runtime.
To reproduce:
private void Form1_Load(object sender, EventArgs e)
{
this.order_DetailsTableAdapter.Fill(this.nwindDataSet.Order_Details);
this.radGridView1.DataSource = this.orderDetailsBindingSource;
this.radGridView1.EnablePaging = true;
this.radGridView1.AutoSizeRows = true;
}
private void radButton1_Click(object sender, EventArgs e)
{
this.radGridView1.PrintStyle.PrintAllPages = true;
this.radGridView1.PrintPreview();
}
Workaround: refresh the MasterTemplate after the PrintPreview dialog is closed:
this.radGridView1.PrintPreview();
this.radGridView1.MasterTemplate.Refresh();
Workaround: change the name of the column this.radGridView1.Columns["Table:Name"].Name = "Table|Name";
When you export ht grid content to HTML, the exported table contains an 'width' attribute set to 0. It is not possible to change this attribute. This prevents the HTML to be loaded correctly in RadRichTextEditor later.
Please refer to the attached sample project. Activate the editor for the "Notes" column of the first row, don't perform any changes and click another row. You will notice that the DataRow.RowState is Modified although no change is performed. If you perform the same actions with a MS DataGridView, the RowState is not Modified.
Note: the GridViewRowInfo.IsModified property in the CellEndEdit is also set to true without modifying the cell's value.
Workaround: handle the CellBeginEdit and CellEndEdit events and compare the values before and after the edit operation:
object initialValue = null;
private void radGridView1_CellBeginEdit(object sender, GridViewCellCancelEventArgs e)
{
initialValue = e.Row.Cells[e.ColumnIndex].Value;
}
private void radGridView1_CellEndEdit(object sender, GridViewCellEventArgs e)
{
if (initialValue != e.Value)
{
Console.WriteLine("modified");
}
else
{
Console.WriteLine("NOT modified");
}
}
Create a DataTable with columns Column1, Column2, Column3, Column4, Column5, and bound to RadGridView. Create a second DataTable with columns Column1, Column2a, Column3, Column4, Column5, and re-bind the RadGridView to this DataTable. Instead of the columns appearing in the same order as they are in the second DataTable, they show up as Column1, Column3, Column4, Column5, Column2a in the RadGridView.
To reproduce:
public Form1()
{
InitializeComponent();
GridViewComboBoxColumn comboCol = new GridViewComboBoxColumn();
comboCol.DataSource = InitComboActive();
comboCol.ValueMember = "ActiveCode";
comboCol.DisplayMember = "ActiveDsc";
comboCol.FieldName = "ActiveCode";
this.radGridView1.Columns.Add(comboCol);
this.radGridView1.AutoGenerateColumns = false;
BindRadGrid();
this.radGridView1.CellValueChanged += radGridView1_CellValueChanged;
}
private void radGridView1_CellValueChanged(object sender, GridViewCellEventArgs e)
{
BindRadGrid();
}
private void BindRadGrid()
{
this.radGridView1.DataSource = null;
this.radGridView1.DataSource = InitComboData();
}
private DataTable InitComboActive()
{
DataTable dt = new DataTable("DtActive");
dt.Columns.Add("ActiveCode");
dt.Columns.Add("ActiveDsc");
dt.Rows.Add("0", "InActive");
dt.Rows.Add("1", "Active");
return dt;
}
private DataTable InitComboData()
{
DataTable dt = new DataTable("DtData");
dt.Columns.Add("Host");
dt.Columns.Add("ActiveCode");
dt.Columns.Add("ActiveDsc");
dt.Rows.Add("Host A", "0", "InActive");
dt.Rows.Add("Host B", "1", "Active");
return dt;
}
Workaround: use the RadGridView.CellEndEdit instead for rebinding.
Workaround 2: use the CellValidated event:
private void radGridView1_CellValidated(object sender, CellValidatedEventArgs e)
{
if (e.Row is GridViewDataRowInfo)
{
BindRadGrid();
}
}