To reproduce: use the following code snippet and try to delete a child row:
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("ParentId", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (int i = 0; i < 5; i++)
{
dt.Rows.Add(i, null, "Item" + i);
}
Random rand = new Random();
for (int i = 5; i < 30; i++)
{
dt.Rows.Add(i, rand.Next(0, 5), "Child item" + i);
}
this.radGridView1.Relations.AddSelfReference(this.radGridView1.MasterTemplate, "Id", "ParentId");
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.UserDeletingRow += radGridView1_UserDeletingRow;
}
private void radGridView1_UserDeletingRow(object sender, Telerik.WinControls.UI.GridViewRowCancelEventArgs e)
{
if (this.radGridView1.CurrentRow.HasChildRows())
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to delete this row?",
"Delete Row confirmation", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No)
{
e.Cancel = true;
}
}
}
Workaround: use the RadGridView.CurrentRow.ChildRows.Count property.
Workaround: subscribe to the PageChanged event and update the scroll range.
private void RadGridView1_PageChanged(object sender, EventArgs e)
{
this.RadGridView1.TableElement.RowScroller.UpdateScrollRange();
}
How to reproduce: the MCCB column needs to be set with AutoCompleteMode.SuggestAppend
public partial class Form1 : Form
{
private List<MyComboItem> listItems;
public Form1()
{
InitializeComponent();
this.listItems = new List<MyComboItem>();
listItems.Add(new MyComboItem("Item1", "This is test for item1"));
listItems.Add(new MyComboItem("Atn time", "This is test for item2"));
listItems.Add(new MyComboItem("Bc chars", "This is test for item3"));
listItems.Add(new MyComboItem("Elsa", "This is test for item4"));
listItems.Add(new MyComboItem("Elementary", "This is test for item4"));
GridViewMultiComboBoxColumn gridviewColumn1 = radGridView1.Columns[0] as GridViewMultiComboBoxColumn;
if (gridviewColumn1 != null)
{
gridviewColumn1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
gridviewColumn1.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown;
gridviewColumn1.DataSource = listItems;
}
}
}
public class MyComboItem
{
public string Code { get; set; }
public string Description { get; set; }
public MyComboItem(string code, string description)
{
this.Code = code;
this.Description = description;
}
}
Workaround: handle the CellEditorInitialized and remove the selection
private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
{
if (radGridView1.CurrentColumn is GridViewMultiComboBoxColumn)
{
RadMultiColumnComboBoxElement editor = e.ActiveEditor as RadMultiColumnComboBoxElement;
if (editor != null && e.Row is GridViewNewRowInfo)
{
editor.SelectedIndex = -1;
}
}
}
Workaround:
private void grid_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.ShiftKey)
{
this.grid.MasterTemplate.ListSource.BeginUpdate();
}
}
private void grid_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.ShiftKey)
{
this.grid.MasterTemplate.ListSource.EndUpdate();
}
}
Selected rows/cells of RadGridView should not be exporting with their selected visual styles and this is why when the export starts all selected rows are cleared. At the end of export selection is restored. This is the reason Validating/ed and SelectionChanged events are fired when exporting with RadGridView exports. Workaround: Unsubscribe from these events before the export starts and subscribe to them again when export operation is completed. this.radGridView1.RowValidating -= radGridView1_RowValidating; this.radGridView1.SelectionChanged -= radGridView1_SelectionChanged; // Export ExportToExcelML excelMLExporter = new ExportToExcelML(this.radGridView1); excelMLExporter.ExportVisualSettings = true; excelMLExporter.RunExport(fileName); this.radGridView1.RowValidating += radGridView1_RowValidating; this.radGridView1.SelectionChanged += radGridView1_SelectionChanged;
Steps to reproduce: - Create a hierarchy grid with four child templates. - Add group descriptors for each template in code - add it before setting the data source of the tempaltes. Workaround: Add the groups descriptor after the data source of the template is set.
Use the attached sample project. Workaround: hide the columns programmatically at run time.
To reproduce: - Add some columns to a grid and make one read-only. - Add a value to the new row then click the read-only cell. - Click outside of the grid (focus another control). - The new row is not added. Workaround: radgridView1.EndEdit() radgridView1.MasterView.TableAddNewRow.EndAddNewRow()
Note: as a result ArgumentException is thrown when accessing a cell value.
To reproduce:
private DataTable dt;
private GridViewRowInfo selectedRow;
public Form1()
{
InitializeComponent();
PopulateGrid();
PopulateGrid();
}
private void PopulateGrid()
{
dt = new DataTable();
dt.Columns.Add("Version No", typeof(Int32));
DataRow dr = dt.NewRow();
dr["Version No"] = 2385;
dt.Rows.Add(dr);
this.radGridView1.DataSource = dt;
MessageBox.Show(selectedRow.Cells[0].ColumnInfo.Name);
MessageBox.Show(selectedRow.Cells[0].Value.ToString()); //This will error on the second time through
}
private void radGridView1_CurrentRowChanged(object sender, CurrentRowChangedEventArgs e)
{
//This event is not firing on the second population of the grid in the new Telerik version.
//In the old version, it did
if (!this.radGridView1.CurrentRow.IsSystem && !this.radGridView1.CurrentRow.HasChildRows() && this.radGridView1.CurrentRow.Cells.Count > 0)
selectedRow = this.radGridView1.CurrentRow;
}
Workaround: use the RadGridView.CurrentRow property directly when accessing the cell value.
To reproduce:
Sub New()
InitializeComponent()
Dim items As New List(Of WorkOrder)
For index = 1 To 56
items.Add(New WorkOrder(index, "Item" & index, 0))
Next
Dim rand As New Random
For index = 57 To 500
items.Add(New WorkOrder(index, "Item" & index, rand.Next(1, 56)))
Next
Me.RadGridView1.Relations.AddSelfReference(Me.RadGridView1.MasterTemplate, "Id", "ParentId")
Me.RadGridView1.DataSource = items
Me.RadGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill
Me.RadGridView1.EnablePaging = True
Me.RadGridView1.PageSize = 20
End Sub
Public Class WorkOrder
Private _id As Integer
Private _name As String
Private _parentId As Integer
Public Sub New(id As Integer, name As String, parentId As Integer)
Me._id = id
Me._name = name
Me._parentId = parentId
End Sub
Public Property Id() As String
Get
Return _id
End Get
Set(ByVal value As String)
_id = value
End Set
End Property
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Public Property ParentID() As Integer
Get
Return _parentId
End Get
Set(ByVal value As Integer)
_parentId = value
End Set
End Property
End Class
Workaround: use standard hierarchy: http://docs.telerik.com/devtools/winforms/gridview/hierarchical-grid/hierarchy-of-one-to-many-relations
To reproduce: - Add a grid with some columns at design time. - Open the designer code and you will notice the TableViewDefinition. Workaround: Manually delete the TableViewDefinition.
To reproduce: use the attached sample project Workaround: refresh the template when updating the data source: this.radGridView1.MasterTemplate.Refresh();
Please find attached a sample project. 1. Select the new row and activate te editor. 2. Do not enter any value and click outside the new row. The exception is thrown. Workaround: bind directly to the query result: this.radGridView1.DataSource = (from p in context.Customers select p).ToList();
To reproduce:
- Add date time column to a grid and set the MaskType to FreeFormDateTime (this can be done by accessing the editor in the CellEditorInitialized event).
- Type a year in the editor and click the right arrow key until the cell is changed.
Workaround:
class MyRadDateTimeEditor : RadDateTimeEditor
{
bool isRightmostMaskItemSelected = false;
public override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Right)
{
FreeFormDateTimeProvider provider = ((RadDateTimeEditorElement) this.EditorElement).TextBoxElement.Provider as FreeFormDateTimeProvider;
if (provider.TextBoxItem.SelectionStart == provider.TextBoxItem.Text.Length)
{
this.isRightmostMaskItemSelected = true;
}
}
else
{
base.OnKeyDown(e);
}
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.Right)
{
if (isRightmostMaskItemSelected)
{
isRightmostMaskItemSelected = false;
GridDateTimeCellElement cell = this.OwnerElement as GridDateTimeCellElement;
cell.GridControl.EndEdit();
}
}
else
{
base.OnKeyUp(e);
}
}
}
void radGridView1_CellEditorInitialized(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
{
RadDateTimeEditor editor = e.ActiveEditor as RadDateTimeEditor;
if (editor != null)
{
var editorElement = editor.EditorElement as RadDateTimeEditorElement;
editorElement.TextBoxElement.MaskType = MaskType.FreeFormDateTime;
}
}
To reproduce:
ColumnGroupsViewDefinition view = new ColumnGroupsViewDefinition();
view.ColumnGroups.Add(new GridViewColumnGroup("Customer Contact"));
view.ColumnGroups[0].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[0].Rows[0].ColumnNames.Add("Address");
view.ColumnGroups[0].Rows[0].ColumnNames.Add("Contact");
radGridView1.Columns.Add("Address");
radGridView1.Columns.Add("Contact");
radGridView1.Columns[0].Width = 300;
radGridView1.Columns[1].Width = 300;
radGridView1.ViewDefinition = view;
for (int i = 0; i < 10; i++)
{
radGridView1.Rows.Add("test test test test test", "test");
}
Workaround:
docs.telerik.com/devtools/winforms/telerik-presentation-framework/export-renderers/spreadexportrenderer
To reproduce: - Add 100000 rows to the grid. - Filter the grid so there are no rows. - Call the BestFitColumns method: radGridView1.MasterTemplate.BestFitColumns(Telerik.WinControls.UI.BestFitColumnMode.DisplayedCells) Workaround: If gridview.MasterTemplate.DataView.Count > 0 Then gridview.MasterTemplate.BestFitColumns() End If
To reproduce:
BindingList<Item> items = new BindingList<Item>();
public Form1()
{
InitializeComponent();
for (int i = 0; i < 5; i++)
{
items.Add(new Item(i,i * 1.25m));
}
this.radGridView1.DataSource = items;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewSummaryItem summaryItem = new GridViewSummaryItem();
summaryItem.Name = "Price";
summaryItem.Aggregate = GridAggregateFunction.Sum;
GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem();
summaryRowItem.Add(summaryItem);
this.radGridView1.SummaryRowsTop.Add(summaryRowItem);
this.timer1.Start();
}
public class Item
{
private int id;
private decimal price;
public Item(int id, decimal price)
{
this.id = id;
this.price = price;
}
public int Id
{
get
{
return this.id;
}
set
{
this.id = value;
}
}
public decimal Price
{
get
{
return this.price;
}
set
{
this.price = value;
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
items[0].Price += 1;
this.radGridView1.Rows[0].InvalidateRow();
this.radGridView1.MasterView.SummaryRows[0].InvalidateRow();
}
Workaround: refresh the MasterTemplate or implement the INotifyPropertyChanged
Similar property is already available in the property grid and tree view exporters.
To reproduce:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var data = new List<Thing>();
this.radGridView1.DataSource = data ;
this.radGridView1.DataError += RadGridView1_DataError;
}
private void RadGridView1_DataError(object sender, Telerik.WinControls.UI.GridViewDataErrorEventArgs e)
{
}
public class Thing
{
private Thing() { }
}
}