To reproduce: - Add several rows to a grid where the paging is enabled (make sure that last row has unique values) - Use the excel like filtering in the first page, notice that the last value is missing. Workaround: void radGridView1_FilterPopupInitialized(object sender, FilterPopupInitializedEventArgs e) { RadListFilterPopup popup = e.FilterPopup as RadListFilterPopup; if (popup != null) { foreach (GridViewRowInfo row in radGridView1.Rows) { var value = row.Cells[e.Column.Name].Value; if (!(popup.MenuTreeElement.DistinctListValues.Contains(value))) { popup.MenuTreeElement.DistinctListValues.Add(value.ToString(), value.ToString()) ; } } } }
It is related to GridViewCalculatorColumn, GridViewBrowseColumn. Workaround: use a custom row behavior and override the ProcessAlphaNumericKey method to initialize the editor with the respective value. http://www.telerik.com/help/winforms/gridview-rows-row-behaviors.html
To reproduce: public Form1() { InitializeComponent(); DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("ParentId", typeof(int)); dt.Columns.Add("IsActive", typeof(bool)); dt.Columns.Add("Title", typeof(string)); for (int i = 1; i < 6; i++) { dt.Rows.Add(i, 0, i % 2 == 0, "Title" + i); } Random rand = new Random(); int parentIndex = 0; for (int i = 6; i < 30; i++) { parentIndex = rand.Next(1, 6); dt.Rows.Add(i, parentIndex, i % 2 == 0, "Title" + i); } radGridView1.DataSource = dt; radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill; radGridView1.Relations.AddSelfReference(radGridView1.MasterTemplate, "Id", "ParentId"); GroupDescriptor descriptor = new GroupDescriptor(); descriptor.GroupNames.Add("Title", System.ComponentModel.ListSortDirection.Ascending); radGridView1.GroupDescriptors.Add(descriptor); this.radGridView1.AllowSearchRow = true; }
To reproduce: use the following code snippet: Steps to repeat: 1. A Self-Referencing Hierarchical Grid is displayed, grouped by the "Title" column. 3. Expand the first group. 4. Check the first row check box. As a result the editor is activated and its value is changed. 5. Click on the "+" sign in 1st row of data to expand and see child rows or just close the editor. You will notice that the group is unexpectedly collapsed. Workaround: private void radGridView1_ValueChanged(object sender, EventArgs e) { if (this.radGridView1.ActiveEditor is RadCheckBoxEditor) { if (this.radGridView1.CurrentRow.Group != null && this.radGridView1.CurrentRow.Group.IsExpanded) { this.radGridView1.EndEdit(); this.radGridView1.CurrentRow.Group.Expand(); } } }
When the current cell belongs to one of the data rows and you click with the left mouse button over a GridFilterCellElement , the editor is activated. However, if you navigate with the arrow keys, the editor is not activated and the user can not see any indication about the current cell. Workaround: private void radGridView1_ViewCellFormatting(object sender, Telerik.WinControls.UI.CellFormattingEventArgs e) { GridFilterCellElement filterCell = e.CellElement as GridFilterCellElement; if (filterCell != null) { if (filterCell.IsCurrent) { filterCell.BorderWidth = 3; } else { filterCell.BorderWidth = 1; } } }
To reproduce: Download the attached project and run it. You will see the memory will increase
To reproduce: - Add grid to a form and populate it with data. - Show and hide the the excel like filtering several times.
When Excel-like filtering is enabled and the user selects an item from the "Available Filters" drop down menu, a CompositeFilterForm is shown.
When current cell is checked (CheckBoxColumn) and the user scrolls one time with the mouse wheel there is a blank space below the grid.
Note: InvalidCastException in case of converting Char to Boolean. To reproduce: use the following code snippet: public Form1() { InitializeComponent(); DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(string)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Active", typeof(string)); dt.Rows.Add("1", "Item1", "Y"); dt.Rows.Add("2", "Item2", "N"); this.radGridView1.DataSource = dt; this.radGridView1.Columns.RemoveAt(2); GridViewCheckBoxColumn checkBoxColumn = new GridViewCheckBoxColumn(); checkBoxColumn.FieldName = "Active"; checkBoxColumn.DataTypeConverter = new ToggleStateConverter(); radGridView1.MasterTemplate.Columns.Add(checkBoxColumn); radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; radGridView1.EnableFiltering = true; } public class ToggleStateConverter : TypeConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { return destinationType == typeof(ToggleState); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { string charValue = value + ""; switch (charValue) { case "Y": return ToggleState.On; case "N": return ToggleState.Off; case "M": return ToggleState.Indeterminate; } return base.ConvertTo(context, culture, value, destinationType); } public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType == typeof(ToggleState); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { ToggleState state = (ToggleState)value; switch (state) { case ToggleState.On: return "Y"; case ToggleState.Off: return "N"; case ToggleState.Indeterminate: return "M"; } return base.ConvertFrom(context, culture, value); } } Try to filter by "Name" column. As a result FormatException occurs because of inability to convert "Y"/"N" to Boolean although a custom TypeConverter is implemented to handle it.
To reproduce: Download the attached project and expand the first row. Collapse it and expand the second row. You will see that both rows will be expanded. Workaround: void radGridView1_ChildViewExpanding(object sender, ChildViewExpandingEventArgs e) { Point p = this.radGridView1.PointToClient(MousePosition); RadElement el = this.radGridView1.ElementTree.GetElementAtPoint(p); if (el != null) { GridRowElement rowElement = el.FindAncestor<GridRowElement>(); if (rowElement != null && e.ParentRow.Index != rowElement.RowInfo.Index && !e.IsExpanded) { e.Cancel = true; } } }
To reproduce: use the following code snippet: DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Duration", typeof(TimeSpan)); for (int i = 0; i < 20; i++) { dt.Rows.Add(i, "Item" + i, TimeSpan.FromMinutes(i * 10)); } this.radGridView1.DataSource = dt; this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.EnableFiltering = true; this.radGridView1.ShowHeaderCellButtons = true; Try to filter via the Excel-Like filtering functionality. Workaround: use dt.Columns.Add("Duration", typeof(string)); instead of dt.Columns.Add("Duration", typeof(TimeSpan));
To reproduce: use the following code snippet: DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("IsActive", typeof(bool)); for (int i = 0; i < 20; i++) { if (i % 5 == 0) { dt.Rows.Add(i, "Item" + i, true); } { dt.Rows.Add(i, "Item" + i, DBNull.Value); } } this.radGridView1.DataSource = dt; this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.EnableFiltering = true; Try to filter by "Name" column via entering "4". As a result an InvalidCastException occurs. Workaround: initialize default value for the cells belonging to GridViewCheckBoxColumn with false if it is DBNull: foreach (GridViewRowInfo r in this.radGridView1.Rows) { if (r.Cells["IsActive"].Value == DBNull.Value) { r.Cells["IsActive"].Value = false; } }
To reproduce: Populate a RadGridView with the following data: DataTable vMain = new DataTable("Details"); vMain.Columns.Add("OutServiceDateGuid", typeof(Guid)); vMain.Columns.Add("預估金額", typeof(string)); vMain.Columns.Add("織造", typeof(bool)); vMain.Columns.Add("狀態", typeof(string)); vMain.Columns.Add("委託廠商", typeof(string)); vMain.Columns.Add("工服單", typeof(string)); vMain.Columns.Add("申請日", typeof(DateTime)); for (int i = 0; i < 40; i++) { vMain.Rows.Add("50ED1E91-868C-42AC-9CA9-00A56F78C3" + i.ToString("0#") ,i.ToString(), true,"", "中心", "103LMH4"+i.ToString(), "2014-10-24 13:04:16.367"); } radGridView1.DataSource = vMain; radGridView1.Columns["OutServiceDateGuid"].IsVisible = false; radGridView1.Columns["申請日"].FormatString = "{0:yyyy/MM/dd}"; radGridView1.Columns["預估金額"].FormatString = "{0:C}"; radGridView1.Columns["狀態"].MaxWidth = 70; // this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; //this.radGridView1.BestFitColumns(BestFitColumnMode.AllCells); // this.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; DataTable vWoven = new DataTable("vWoven"); vWoven.Columns.Add("OutServiceDateGuid", typeof(Guid)); vWoven.Columns.Add("NameOrColor", typeof(string)); vWoven.Columns.Add("Qty", typeof(string)); vWoven.Columns.Add("QtyUnitName", typeof(string)); vWoven.Columns.Add("Weight", typeof(string)); vWoven.Columns.Add("SumPrice", typeof(string)); for (int i = 0; i < 40; i++) { vWoven.Rows.Add("50ED1E91-868C-42AC-9CA9-00A56F78C3" + (i + 1).ToString("0#"), " vWoven中心" + i.ToString(), i, i, i); } GridViewTemplate template1 = new GridViewTemplate(); template1.Caption = "織造"; template1.DataSource = vWoven; template1.Columns["OutServiceDateGuid"].IsVisible = false; template1.Columns["NameOrColor"].HeaderText = "成品名與規格"; template1.Columns["Qty"].HeaderText = "數量"; template1.Columns["QtyUnitName"].HeaderText = "單位"; template1.Columns["Weight"].HeaderText = "重量"; template1.Columns["SumPrice"].HeaderText = "金額"; //template1.BestFitColumns(BestFitColumnMode.AllCells); template1.AllowRowResize = false; template1.ShowColumnHeaders = true; template1.ShowRowHeaderColumn = true; template1.AllowAddNewRow = false; template1.AllowDeleteRow = false; template1.AllowDragToGroup = false; this.radGridView1.Templates.Add(template1); GridViewRelation relation1 = new GridViewRelation(this.radGridView1.MasterTemplate); relation1.ChildTemplate = template1; relation1.ParentColumnNames.Add("OutServiceDateGuid"); relation1.ChildColumnNames.Add("OutServiceDateGuid"); this.radGridView1.Relations.Add(relation1); DataTable vDye = new DataTable("vDye"); vDye.Columns.Add("OutServiceDateGuid", typeof(Guid)); vDye.Columns.Add("NameOrColor", typeof(string)); vDye.Columns.Add("ColorNo", typeof(string)); vDye.Columns.Add("Qty", typeof(string)); vDye.Columns.Add("QtyUnitName", typeof(string)); vDye.Columns.Add("Weight", typeof(string)); vDye.Columns.Add("SumPrice", typeof(string)); for (int i = 0; i < 20; i++) { vDye.Rows.Add("50ED1E91-868C-42AC-9CA9-00A56F78C3" + (i + 1).ToString("0#"), " vDye中心" + i.ToString(),"", i, i, i); } GridViewTemplate template2 = new GridViewTemplate(); template2.Caption = "染整"; template2.DataSource = vDye; template2.Columns["OutServiceDateGuid"].IsVisible = false; template2.Columns["NameOrColor"].HeaderText = "顏色"; template2.Columns["ColorNo"].HeaderText = "色號"; template2.Columns["Qty"].HeaderText = "數量"; template2.Columns["QtyUnitName"].HeaderText = "單位"; template2.Columns["Weight"].HeaderText = "重量"; template2.Columns["SumPrice"].HeaderText = "金額"; //template2.BestFitColumns(BestFitColumnMode.AllCells); template2.AllowAddNewRow = false; template2.AllowRowResize = false; template2.ShowColumnHeaders = true; template2.ShowRowHeaderColumn = true; template2.AllowDeleteRow = false; template2.AllowDragToGroup = false; this.radGridView1.Templates.Add(template2); GridViewRelation relation2 = new GridViewRelation(this.radGridView1.MasterTemplate); relation2.ChildTemplate = template2; relation2.ParentColumnNames.Add("OutServiceDateGuid"); relation2.ChildColumnNames.Add("OutServiceDateGuid"); this.radGridView1.Relations.Add(relation2); DataTable vAppoint = new DataTable("vAppoint"); vAppoint.Columns.Add("OutServiceDateGuid", typeof(Guid)); vAppoint.Columns.Add("NameOrColor", typeof(string)); vAppoint.Columns.Add("Qty", typeof(string)); vAppoint.Columns.Add("QtyUnitName", typeof(string)); vAppoint.Columns.Add("Weight", typeof(string)); vAppoint.Columns.Add("SumPrice", typeof(string)); for (int i = 0; i < 20; i++) { vAppoint.Rows.Add("50ED1E91-868C-42AC-9CA9-00A56F78C3" + (i + 2).ToString("0#"), "vAppoint中心" + i.ToString(), i, i, i); } GridViewTemplate template3 = new GridViewTemplate(); template3.Caption = "委外"; template3.DataSource = vAppoint; template3.Columns["OutServiceDateGuid"].IsVisible = false; template3.Columns["NameOrColor"].HeaderText = "委外內容"; template3.Columns["SumPrice"].HeaderText = "金額"; //template3.BestFitColumns(BestFitColumnMode.AllCells); template3.AllowAddNewRow = false; template3.AllowRowResize = false; template3.ShowColumnHeaders = true; template3.ShowRowHeaderColumn = true; template3.AllowDeleteRow = false; template3.AllowDragToGroup = false; this.radGridView1.Templates.Add(template3); GridViewRelation relation3 = new GridViewRelation(this.radGridView1.MasterTemplate); relation3.ChildTemplate = template3; relation3.ParentColumnNames.Add("OutServiceDateGuid"); relation3.ChildColumnNames.Add("OutServiceDateGuid"); this.radGridView1.Relations.Add(relation3); DataTable vMembrane = new DataTable("vMembrane"); vMembrane.Columns.Add("OutServiceDateGuid", typeof(Guid)); vMembrane.Columns.Add("NameOrColor", typeof(string)); vMembrane.Columns.Add("Qty", typeof(string)); vMembrane.Columns.Add("QtyUnitName", typeof(string)); vMembrane.Columns.Add("Weight", typeof(string)); vMembrane.Columns.Add("SumPrice", typeof(string)); //for (int i = 0; i < 40; i++) //{ // vMembrane.Rows.Add("50ED1E91-868C-42AC-9CA9-00A56F78C3" + (i + 3).ToString("0#"), "vMembrane中心" + i.ToString(), i, i, i); //} GridViewTemplate template4 = new GridViewTemplate(); template4.Caption = "膜"; template4.DataSource = vMembrane; template4.Columns["OutServiceDateGuid"].IsVisible = false; template4.Columns["NameOrColor"].HeaderText = "成品規格"; template4.Columns["Qty"].HeaderText = "數量"; template4.Columns["QtyUnitName"].HeaderText = "單位"; template4.Columns["SumPrice"].HeaderText = "金額"; //template4.BestFitColumns(BestFitColumnMode.AllCells); template4.AllowAddNewRow = false; template4.AllowRowResize = false; template4.ShowColumnHeaders = true; template4.ShowRowHeaderColumn = true; template4.AllowDeleteRow = false; template4.AllowDragToGroup = false; this.radGridView1.Templates.Add(template4); GridViewRelation relation4 = new GridViewRelation(this.radGridView1.MasterTemplate); relation4.ChildTemplate = template4; relation4.ParentColumnNames.Add("OutServiceDateGuid"); relation4.ChildColumnNames.Add("OutServiceDateGuid"); this.radGridView1.Relations.Add(relation4); DataTable vCheck = new DataTable("vCheck"); vCheck.Columns.Add("OutServiceDateGuid", typeof(Guid)); vCheck.Columns.Add("NameOrColor", typeof(string)); vCheck.Columns.Add("Qty", typeof(string)); vCheck.Columns.Add("QtyUnitName", typeof(string)); vCheck.Columns.Add("Weight", typeof(string)); vCheck.Columns.Add("SumPrice", typeof(string)); vCheck.Columns.Add("CheckItem", typeof(string)); //for (int i = 0; i <10; i++) //{ // vCheck.Rows.Add("50ED1E91-868C-42AC-9CA9-00A56F78C3" + (i + 4).ToString("0#"), "中心" + i.ToString(), i, i, i); //} GridViewTemplate template5 = new GridViewTemplate(); template5.Caption = "檢測"; template5.DataSource = vCheck; template5.Columns["OutServiceDateGuid"].IsVisible = false; template5.Columns["NameOrColor"].HeaderText = "樣品名稱與規格"; template5.Columns["CheckItem"].HeaderText = "檢驗項目"; template5.Columns["CheckItem"].WrapText = true; template5.Columns["Qty"].HeaderText = "數量"; template5.Columns["QtyUnitName"].HeaderText = "單位"; template5.Columns["SumPrice"].HeaderText = "金額"; //template5.BestFitColumns(BestFitColumnMode.AllCells); template5.AllowAddNewRow = false; template5.AllowRowResize = false; template5.ShowColumnHeaders = true; template5.ShowRowHeaderColumn = true; template5.AllowDeleteRow = false; template5.AllowDragToGroup = false; this.radGridView1.Templates.Add(template5); GridViewRelation relation5 = new GridViewRelation(this.radGridView1.MasterTemplate); relation5.ChildTemplate = template5; relation5.ParentColumnNames.Add("OutServiceDateGuid"); relation5.ChildColumnNames.Add("OutServiceDateGuid"); this.radGridView1.Relations.Add(relation5); Open the application and scroll the grid a bit, you will see that any newly layouted cell will be on the most left corner. Workaround: Use the following code after populating the grid with data: this.radGridView1.Columns[3].Width += 5; this.radGridView1.Columns[3].Width -= 5;
To reproduce: 1. Add GridView which inherits the RadGridView 2. Populate the grid with some data 3. Add conditional formatting and set RowBackColor and CellBackColor 4. Subscribe to RowFormatting event and change the font of selected row: void radGridView2_RowFormatting(object sender, RowFormattingEventArgs e) { if (e.RowElement.IsSelected) { e.RowElement.Font = new Font(this.Font.FontFamily, this.Font.Size + 2, FontStyle.Bold); } else { e.RowElement.ResetValue(LightVisualElement.FontProperty, ValueResetFlags.Local); //e.RowElement.Font = this.Font; } } 5. Select row with conditional formatting. The font of selected row is bold which is correct. Select another row and you will see that the previous row is still bold. Workaround: Subscribe to CellFormatting event instead RowFormatting void radGridView2_CellFormatting(object sender, CellFormattingEventArgs e) { if (e.Row.IsSelected) { e.CellElement.Font = new Font(this.Font.FontFamily, this.Font.Size + 2, FontStyle.Bold); } else { e.CellElement.ResetValue(LightVisualElement.FontProperty, ValueResetFlags.Local); } }
Workaround: RadDragDropService dragDropService; int scrollValue = 0; public Form1() { InitializeComponent(); dragDropService = this.leftGrid.GridViewElement.GetService<RadDragDropService>(); dragDropService.Started += dragDropService_Started; leftGrid.TableElement.VScrollBar.ValueChanged += VScrollBar_ValueChanged; } private void dragDropService_Started(object sender, EventArgs e) { scrollValue = this.leftGrid.TableElement.VScrollBar.Value; } private void VScrollBar_ValueChanged(object sender, EventArgs e) { if (dragDropService != null && dragDropService.State == RadServiceState.Working) { this.leftGrid.TableElement.VScrollBar.Value = scrollValue; } } Resolution: Added AllowAutoScrollColumnsWhileDragging and AllowAutoScrollRowsWhileDragging properties of RadGridViewDragDropService: RadGridViewDragDropService svc = this.GridViewElement.GetService<RadGridViewDragDropService>(); svc.AllowAutoScrollColumnsWhileDragging = false; svc.AllowAutoScrollRowsWhileDragging = false; svc.Start(row);
To reproduce: Download the attached project, run it and try to filter the bottom grid. You will see the exception Workaround: Use the following custom RadGridView: public class MyGrid : RadGridView { protected override RadGridViewElement CreateGridViewElement() { return new MyGridElement(); } } public class MyGridElement : RadGridViewElement { protected override MasterGridViewTemplate CreateTemplate() { return new MyMasterTemplate(); } protected override Type ThemeEffectiveType { get { return typeof(RadGridViewElement); } } } public class MyMasterTemplate : MasterGridViewTemplate { private MyEventDispatcher dispatcher = new MyEventDispatcher(); public override EventDispatcher EventDispatcher { get { return this.dispatcher; } } } public class MyEventDispatcher : EventDispatcher { public override void RaiseEvent<T>(object eventKey, object sender, T args) { GridViewCellEventArgs cellArgs = args as GridViewCellEventArgs; if (cellArgs != null && cellArgs.Column == null && cellArgs.Row == null) { typeof(GridViewCellEventArgsBase) .GetField("column", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) .SetValue(cellArgs, new GridViewTextBoxColumn()); typeof(GridViewCellEventArgsBase) .GetField("row", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) .SetValue(cellArgs, new GridViewDataRowInfo(null)); } base.RaiseEvent<T>(eventKey, sender, args); } }
To reproduce use the following snippets in the CellFormatting event of the exporter: ThemableColor red = new ThemableColor(System.Windows.Media.Colors.Red); CellBorders redBorders = new CellBorders(new CellBorder(CellBorderStyle.Medium, red)); e.CellStyleInfo.Borders = redBorders; or ThemableColor red = new ThemableColor(System.Windows.Media.Colors.Red); CellBorders fourBorders = new CellBorders(); fourBorders.Top = new CellBorder(CellBorderStyle.Thin, red); fourBorders.Bottom = new CellBorder(CellBorderStyle.Thin, red); fourBorders.Right = new CellBorder(CellBorderStyle.Thin, red); fourBorders.Left = new CellBorder(CellBorderStyle.Thin, red); e.CellStyleInfo.Borders = fourBorders;
Currently the Paging functionality does not support server side operations. It should be extended to support them, e.g. with EntityFramework and Telerik Data Access
To reproduce: - Type &1 in a grid cell and then press enter to exit edit mode. - Press tab for example to move to the next cell. - Press 1 again you will notice that the digit does not appear in the cell.