How to Reproduce:
Source XML:
<?xml version="1.0" encoding="utf-8"?>
<grandparent Date="2014-12-17Z" Name="Grandparent" SchemaVersion="1.0" Time="04:27:07Z" xmlns="">
<parent Name="parent1" City="Los Angeles">
<child Name="Child1" Age="5"/>
<child Name="Child2" Age="8"/>
</parent>
<parent Name="parent2" City="Chicago">
<child Name="Child1" Age="11"/>
<child Name="Child2" Age="15"/>
</parent>
</grandparent>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataSet xmlDataSet = new DataSet();
xmlDataSet.ReadXml(@"..\..\test.xml");
GridViewTemplate parentTemplate = new GridViewTemplate();
this.radGridView1.MasterTemplate.Templates.Add(parentTemplate);
GridViewRelation relation = new GridViewRelation(this.radGridView1.MasterTemplate);
relation.ChildTemplate = parentTemplate;
relation.RelationName = "Grandparent_Parent";
relation.ParentColumnNames.Add("grandparent_Id");
relation.ChildColumnNames.Add("grandparent_Id");
radGridView1.Relations.Add(relation);
this.radGridView1.DataSource = xmlDataSet.Tables[0];
parentTemplate.DataSource = xmlDataSet.Tables[1];
parentTemplate.AllowAddNewRow = false;
GridViewTemplate childTemplate = new GridViewTemplate();
parentTemplate.Templates.Add(childTemplate);
GridViewRelation childRelation = new GridViewRelation(parentTemplate);
childRelation.ChildTemplate = childTemplate;
childRelation.RelationName = "Parent_Child";
childRelation.ParentColumnNames.Add("parent_Id");
childRelation.ChildColumnNames.Add("parent_Id");
radGridView1.Relations.Add(childRelation);
childTemplate.DataSource = xmlDataSet.Tables[2];
}
}
Workaround - set the data sources of the templates last, or use auto generate hierarchy:
this.radGridView1.AutoGenerateHierarchy = true;
DataSet xmlDataSet = new DataSet();
xmlDataSet.ReadXml(@"..\..\test.xml");
this.radGridView1.DataSource = xmlDataSet;
radGridView1.DataMember = "grandparent";
this.radGridView1.AutoGenerateHierarchy = true;
Hello,
I succeed to reproduce the GridViewComboboxColumn exception in this forum post:
http://www.telerik.com/forums/nullreferenceexception-4a6181b2453b#cwDrbIqzp0CPxcgh90b4rQ
I attach a sample project, the database (SQL Server 2012 Express) and a video from the exception.
To reproduce:
- Run the project,
- Sort the column "Állapot" descending.
- Click on column and drop down the list.
- Choose an another value, and click very fast twice. On a slow PC is much easier to reproduce the issue. The important thing, that you need select a value from the combobox and select another row very fast. (See the attached video)
I use the latest Trial version of Winforms.
If you have any question, please contact me.
Best Regards,
László
Workaround:
Private Sub gridMunkak_CreateCell(sender As Object, e As GridViewCreateCellEventArgs) Handles gridMunkak.CreateCell
If e.CellType = GetType(GridComboBoxCellElement) Then
e.CellElement = New MyGridComboBoxCellElement(e.Column, e.Row)
End If
End Sub
Public Class MyGridComboBoxCellElement
Inherits GridComboBoxCellElement
Public Sub New(column As GridViewColumn, row As GridRowElement)
MyBase.New(column, row)
End Sub
Public Overrides Sub SetContent()
If Me.ColumnInfo IsNot Nothing Then
MyBase.SetContent()
End If
End Sub
Protected Overrides ReadOnly Property ThemeEffectiveType() As Type
Get
Return GetType(GridComboBoxCellElement)
End Get
End Property
End Class
To reproduce: use the following code snippet and refer to the attached gif file:
public Form1()
{
InitializeComponent();
for (int i = 0; i < 20; i++)
{
this.radGridView1.Columns.Add("Col" + i);
}
for (int i = 0; i < 10; i++)
{
GridViewDataRowInfo row = this.radGridView1.Rows.AddNew() as GridViewDataRowInfo;
foreach (GridViewColumn col in this.radGridView1.Columns)
{
row.Cells[col.Name].Value = "Data" + row.Index + "." + col.Index;
}
}
this.radGridView1.MultiSelect = true;
this.radGridView1.SelectionMode = GridViewSelectionMode.CellSelect;
}
Workaround:
int startColumn = int.MaxValue;
int endColumn = 0;
int startRow = int.MaxValue;
int endRow = 0;
private void radGridView1_MouseDown(object sender, MouseEventArgs e)
{
GridDataCellElement cellElement = this.radGridView1.ElementTree.GetElementAtPoint(e.Location) as GridDataCellElement;
if (cellElement != null)
{
startColumn = cellElement.ColumnIndex;
startRow = cellElement.RowIndex;
}
}
private void radGridView1_MouseUp(object sender, MouseEventArgs e)
{
GridDataCellElement cellElement = this.radGridView1.ElementTree.GetElementAtPoint(e.Location) as GridDataCellElement;
if (cellElement != null)
{
endColumn = cellElement.ColumnIndex;
endRow = cellElement.RowIndex;
}
if (endColumn < startColumn)
{
int swap = endColumn;
endColumn = startColumn;
startColumn = swap;
}
if (endRow < startRow)
{
int swap = endRow;
endRow = startRow;
startRow = swap;
}
this.radGridView1.ClearSelection();
int scrollBarValue = this.radGridView1.TableElement.HScrollBar.Value;
this.radGridView1.BeginUpdate();
for (int i = startRow; i < endRow + 1; i++)
{
for (int j = startColumn; j < endColumn + 1; j++)
{
if (!this.radGridView1.Rows[i].Cells[j].IsSelected)
{
this.radGridView1.Rows[i].Cells[j].IsSelected = true;
}
}
}
this.radGridView1.EndUpdate();
this.radGridView1.TableElement.HScrollBar.Value = scrollBarValue;
}
To reproduce: use the following code snippet and follow the steps illustrated on the attached gif file:
private void Form1_Load(object sender, EventArgs e)
{
this.customersTableAdapter.Fill(this.nwindDataSet.Customers);
this.radGridView1.DataSource = this.customersBindingSource;
this.radGridView1.BestFitColumns(BestFitColumnMode.AllCells);
ColumnGroupsViewDefinition view = new ColumnGroupsViewDefinition();
view.ColumnGroups.Add(new GridViewColumnGroup("Customer Contact"));
view.ColumnGroups.Add(new GridViewColumnGroup("Details"));
view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Address"));
view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Contact"));
view.ColumnGroups[0].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[0].Rows[0].Columns.Add(this.radGridView1.Columns["CompanyName"]);
view.ColumnGroups[0].Rows[0].Columns.Add(this.radGridView1.Columns["ContactName"]);
view.ColumnGroups[0].Rows[0].Columns.Add(this.radGridView1.Columns["ContactTitle"]);
view.ColumnGroups[1].Groups[0].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[1].Groups[0].Rows[0].Columns.Add(this.radGridView1.Columns["Address"]);
view.ColumnGroups[1].Groups[0].Rows[0].Columns.Add(this.radGridView1.Columns["City"]);
view.ColumnGroups[1].Groups[0].Rows[0].Columns.Add(this.radGridView1.Columns["Country"]);
view.ColumnGroups[1].Groups[1].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[1].Groups[1].Rows[0].Columns.Add(this.radGridView1.Columns["Phone"]);
view.ColumnGroups[1].Groups[1].Rows[0].Columns.Add(this.radGridView1.Columns["Fax"]);
radGridView1.ViewDefinition = view;
}
Sometimes the incorrect behavior is obtained immediately after you drop the column, but you need to scroll the horizontal scroll-bar to replicate it.
Workaround:
RadGridViewDragDropService svc = this.radGridView1.GridViewElement.GetService<RadGridViewDragDropService>();
svc.Stopped += svc_Stopped;
private void svc_Stopped(object sender, EventArgs e)
{
int horizontalScrollvalue = this.radGridView1.TableElement.HScrollBar.Value;
this.radGridView1.MasterTemplate.Refresh();
this.radGridView1.TableElement.HScrollBar.Value = horizontalScrollvalue;
}
Workaround:
Subscribe to CellFormatting event:
void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e)
{
if (e.CellElement is GridCheckBoxCellElement)
{
e.CellElement.ToolTipText = "ErrorMessage for CheckBoxColumn";
e.CellElement.Children[0].ToolTipText = "ErrorMessage for CheckBoxColumn";
e.CellElement.Children[0].Children[0].ToolTipText = "ErrorMessage for CheckBoxColumn";
}
}
To reproduce:
this.radGridView1.MultiSelect = true;
Please refer to the attached gif file illustrating better the behavior.
1. Select a row and filter the grid in a way to keep the selected row visible.
2. The first row in the ChildRows collection is selected.
3. Clear the filter. The selection is stored and only one row is selected.
4. Repeat the above steps, but perform such filtering that hides the selected cell. When you clear the filter, two rows are selected instead of one.
Workaround:
private void radGridView1_FilterChanged(object sender, Telerik.WinControls.UI.GridViewCollectionChangedEventArgs e)
{
this.radGridView1.ClearSelection();
if (this.radGridView1.CurrentCell!=null)
{
this.radGridView1.CurrentCell.IsSelected = true;
this.radGridView1.CurrentRow.IsSelected = true;
this.radGridView1.GridNavigator.Select(this.radGridView1.CurrentRow, this.radGridView1.CurrentColumn);
}
}
To reproduce:
string fileName = @"..\..\..\exported" + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + ".xlsx";
SpreadExport spreadExporter = new SpreadExport(radGridView1);
spreadExporter.ExportVisualSettings = false;
spreadExporter.RunExport(fileName);
Workaround:
spreadExporter.WorkbookCreated += spreadExporter_WorkbookCreated;
private void spreadExporter_WorkbookCreated(object sender, WorkbookCreatedEventArgs e)
{
Telerik.Windows.Documents.Spreadsheet.PropertySystem.CellStyle defaultStyle = e.Workbook.Styles.Add("DefaultStyle");
defaultStyle.FontSize = Telerik.Windows.Documents.Spreadsheet.Utilities.UnitHelper.PointToDip(11);
Telerik.Windows.Documents.Spreadsheet.Model.Worksheet sheet = e.Workbook.Worksheets.First();
sheet.Cells[0, 0, sheet.UsedCellRange.RowCount, sheet.UsedCellRange.ColumnCount].SetStyleName("DefaultStyle");
sheet.Columns[sheet.UsedCellRange].AutoFitWidth();
}
Use the following code snippet and follow the illustrated steps on the attached gif file:
private void Form1_Load(object sender, EventArgs e)
{
this.customersTableAdapter.Fill(this.nwindDataSet.Customers);
this.radGridView1.DataSource = this.customersBindingSource;
this.radGridView1.BestFitColumns(BestFitColumnMode.AllCells);
ColumnGroupsViewDefinition view = new ColumnGroupsViewDefinition();
view.ColumnGroups.Add(new GridViewColumnGroup("Customer Contact"));
view.ColumnGroups.Add(new GridViewColumnGroup("Details"));
view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Address"));
view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Contact"));
view.ColumnGroups[0].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[0].Rows[0].Columns.Add(this.radGridView1.Columns["CompanyName"]);
view.ColumnGroups[0].Rows[0].Columns.Add(this.radGridView1.Columns["ContactName"]);
view.ColumnGroups[0].Rows[0].Columns.Add(this.radGridView1.Columns["ContactTitle"]);
view.ColumnGroups[1].Groups[0].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[1].Groups[0].Rows[0].Columns.Add(this.radGridView1.Columns["Address"]);
view.ColumnGroups[1].Groups[0].Rows[0].Columns.Add(this.radGridView1.Columns["City"]);
view.ColumnGroups[1].Groups[0].Rows[0].Columns.Add(this.radGridView1.Columns["Country"]);
view.ColumnGroups[1].Groups[1].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[1].Groups[1].Rows[0].Columns.Add(this.radGridView1.Columns["Phone"]);
view.ColumnGroups[1].Groups[1].Rows[0].Columns.Add(this.radGridView1.Columns["Fax"]);
radGridView1.ViewDefinition = view;
}
To reproduce:
public RadForm1()
{
InitializeComponent();
DataTable master = new DataTable();
master.Columns.Add("ID", typeof(int));
master.Columns.Add("F_ID", typeof(int));
master.Columns.Add("test", typeof(string));
DataTable child = new DataTable();
child.Columns.Add("F_ID", typeof(int));
child.Columns.Add("test", typeof(string));
child.Columns.Add("CheckBox", typeof(bool));
for (int i = 0; i < 10; i++)
{
master.Rows.Add(i, i , "Row " + i);
child.Rows.Add(i , "Child " + i, true);
}
radGridView1.DataSource = master;
GridViewTemplate template = new GridViewTemplate();
template.DataSource = child;
radGridView1.MasterTemplate.Templates.Add(template);
GridViewRelation relation = new GridViewRelation(radGridView1.MasterTemplate);
relation.ChildTemplate = template;
relation.RelationName = "Test";
relation.ParentColumnNames.Add("F_ID");
relation.ChildColumnNames.Add("F_ID");
radGridView1.Relations.Add(relation);
this.Load += RadForm1_Load;
}
void RadForm1_Load(object sender, EventArgs e)
{
GridViewCheckBoxColumn col = radGridView1.MasterTemplate.Templates[0].Columns[2] as GridViewCheckBoxColumn;
col.EnableHeaderCheckBox = true;
}
- Expand some rows and click on header check box.
To reproduce:
this.radGridView1.MultiSelect = true;
GroupDescriptor descriptor1 = new GroupDescriptor();
descriptor1.GroupNames.Add("ProductId", ListSortDirection.Ascending );
this.radGridView1.GroupDescriptors.Add(descriptor1);
Please refer to the attached gif file.
Workaround - hide the expander items if space is not enough:
private void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e)
{
GridDataCellElement cell = e.CellElement as GridDataCellElement;
if (cell != null && cell.SelfReferenceLayout != null)
{
foreach (RadElement element in cell.SelfReferenceLayout.StackLayoutElement.Children)
{
GridExpanderItem expanderItem = element as GridExpanderItem;
if (expanderItem != null)
{
if (cell.ColumnInfo.Width < cell.SelfReferenceLayout.StackLayoutElement.Size.Width)
{
expanderItem.Opacity = 0;
}
else
{
expanderItem.Opacity = 1;
}
}
}
}
}
To reproduce:
List<Coordinate> coordinates_ = new List<Coordinate>();
public Form1()
{
InitializeComponent();
for (int i = 0; i < 10; i++)
{
coordinates_.Add(new Coordinate(i * 0.25, i * 0.33, i * 0.46));
}
this.radGridView1.AutoGenerateColumns = false;
string mask = "F2";
this.radGridView1.Columns.Add(CreateDecimalColumn("X", "X", mask));
this.radGridView1.Columns.Add(CreateDecimalColumn("Y", "Y", mask));
this.radGridView1.Columns.Add(CreateDecimalColumn("Z", "Z", mask));
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
SetRows();
}
GridViewDataColumn CreateDecimalColumn(string name, string headertext, string mask)
{
var format = "{0:" + mask + "}";
return new GridViewMaskBoxColumn()
{
Name = name,
HeaderText = headertext,
MinWidth = 50,
MaskType = MaskType.Numeric,
Mask = mask,
FormatString = format,
DataType = typeof(double),
TextAlignment = ContentAlignment.MiddleRight
};
}
void SetRows()
{
foreach (var c in coordinates_)
{
var ri = radGridView1.Rows.AddNew();
ri.Cells["X"].Value = c.X;
ri.Cells["Y"].Value = c.Y;
ri.Cells["Z"].Value = c.Z;
}
}
public class Coordinate
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public Coordinate(double x, double y, double z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
}
Workaround:
private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
{
if (e.EditorType==typeof(RadMaskedEditBoxEditor))
{
e.Editor = new RadMaskedEditBoxEditor();
}
}
To reproduce:
public Form1()
{
InitializeComponent();
GridViewDecimalColumn idColumn = new GridViewDecimalColumn("ID");
radGridView1.MasterTemplate.Columns.Add(idColumn);
GridViewDecimalColumn parentIdColumn = new GridViewDecimalColumn("ParentID");
radGridView1.MasterTemplate.Columns.Add(parentIdColumn);
GridViewTextBoxColumn nameColumn = new GridViewTextBoxColumn("Name");
radGridView1.MasterTemplate.Columns.Add(nameColumn);
GridViewTextBoxColumn addressColumn = new GridViewTextBoxColumn("Address");
radGridView1.MasterTemplate.Columns.Add(addressColumn);
GridViewTextBoxColumn typeColumn = new GridViewTextBoxColumn("Type");
radGridView1.MasterTemplate.Columns.Add(typeColumn);
radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.Relations.AddSelfReference(this.radGridView1.MasterTemplate, "ID", "ParentID");
AddNewRow("1", null, "Project", "USA", "Project");
AddNewRow("2", "1", "Site 1", "New York", "Site");
AddNewRow("3", "2", "Bldg 1", "Road 1", "Building");
AddNewRow("4", "1", "Site 2", "New York", "Site");
AddNewRow("5", "4", "Bldg 2", "Road 2", "Building");
AddNewRow("20", "3", "Floor 1", "Road 20", "Floor");
AddNewRow("30", "3", "Floor 2", "Road 30", "Floor");
AddNewRow("40", "3", "Floor 3", "Road 40", "Floor");
}
public void AddNewRow(
params object[] values)
{
if (values.Length != radGridView1.Columns.Count)
return;
GridViewRowInfo newRow = radGridView1.Rows.AddNew();
newRow.Cells[0].Value = values[0];
newRow.Cells[1].Value = values[1];
newRow.Cells[2].Value = values[2];
newRow.Cells[3].Value = values[3];
newRow.Cells[4].Value = values[4];
}
When you run the project you will notice that the last row is missing (AddNewRow("40", "3", "Floor 3", "Road 40", "Floor");). Please refer to the attached screenshots.
Workaround: use the Rows.Add(params) method instead:
To reproduce: - Add a column to the grid and try to set its IsPinned property to true.
How to reproduce: just create a grid with a great number of rows e.g. 15000 and scroll down using the page down key
Workaround:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
BaseGridBehavior gridBehavior = radGridView1.GridBehavior as BaseGridBehavior;
gridBehavior.UnregisterBehavior(typeof(GridViewDataRowInfo));
gridBehavior.RegisterBehavior(typeof(GridViewDataRowInfo), new CustomGridDataRowBehavior());
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Id", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("IsValid", typeof(bool));
for (int i = 0; i < 14000; i++)
{
dataTable.Rows.Add(i, "Name " + i, i % 2 == 0 ? true : false);
}
this.radGridView1.DataSource = dataTable;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
}
}
public class CustomGridDataRowBehavior : GridDataRowBehavior
{
protected override bool ProcessPageUpKey(KeyEventArgs keys)
{
GridTableElement tableElement = (GridTableElement)this.GridViewElement.CurrentView;
int index = this.GridViewElement.CurrentRow.Index - tableElement.RowsPerPage + 1;
if (index < 0)
{
index = 0;
}
GridViewRowInfo firstScrollableRow = this.GridControl.Rows[index];
this.GridViewElement.CurrentRow = firstScrollableRow;
return true;
}
protected override bool ProcessPageDownKey(KeyEventArgs keys)
{
GridTableElement tableElement = (GridTableElement)this.GridViewElement.CurrentView;
int index = this.GridViewElement.CurrentRow.Index + tableElement.RowsPerPage - 1;
if (index > this.GridControl.Rows.Count - 1)
{
index = this.GridControl.Rows.Count - 1;
}
GridViewRowInfo lastScrollableRow = this.GridControl.Rows[index];
this.GridViewElement.CurrentRow = lastScrollableRow;
return true;
}
}
One should be able to replace the exported file if such exists.