Work around: create a custom GridCheckBoxHeaderCellElement and override the SetCheckBoxState method public class MyGridCheckBoxHeaderCellElement : GridCheckBoxHeaderCellElement { public MyGridCheckBoxHeaderCellElement(GridViewColumn column, GridRowElement row) : base(column, row) { } protected override Type ThemeEffectiveType { get { return typeof(GridHeaderCellElement); } } protected override bool SetCheckBoxState() { bool foundNonCheckedRows = false; foreach (GridViewRowInfo row in this.ViewInfo.Rows) { foundNonCheckedRows = this.CheckCheckBoxValueForAllRows(row, foundNonCheckedRows); if (foundNonCheckedRows) { SetCheckBoxState(ToggleState.Off); break; } } if (!foundNonCheckedRows && this.ViewInfo.Rows.Count > 0) //we must have at least one row in order to check the header cell { SetCheckBoxState(ToggleState.On); } return foundNonCheckedRows; } private bool CheckCheckBoxValueForAllRows(GridViewRowInfo row, bool foundNonCheckedRows) { GridViewChildRowCollection currentRowColection; if (foundNonCheckedRows) { return foundNonCheckedRows; } if (row.HasChildRows()) { currentRowColection = row.ChildRows; } else { currentRowColection = row.ViewInfo.Rows; } foreach (GridViewRowInfo rowInfo in currentRowColection) { GridViewGroupRowInfo groupInfo = rowInfo as GridViewGroupRowInfo; if (groupInfo != null) { foundNonCheckedRows = this.CheckCheckBoxValueForAllRows(groupInfo, foundNonCheckedRows); } else { object cellValue = rowInfo.Cells[this.ColumnIndex].Value; bool? valueFromColumnTypeConvertor = null; if (this.ColumnInfo is GridViewDataColumn) { TypeConverter convertor = ((GridViewDataColumn)this.ColumnInfo).DataTypeConverter; if (convertor != null && (convertor.CanConvertTo(typeof(bool)) || convertor.CanConvertTo(typeof(ToggleState)))) { try { valueFromColumnTypeConvertor = Convert.ToBoolean(convertor.ConvertTo(cellValue, typeof(bool))); } catch (FormatException)//convert to bool fails { } catch (NotSupportedException)//coverting NULL { } } } try { if (rowInfo != this.RowInfo && (cellValue == null || cellValue == DBNull.Value) || (valueFromColumnTypeConvertor.HasValue && !valueFromColumnTypeConvertor.Value) || (!valueFromColumnTypeConvertor.HasValue && !Convert.ToBoolean(cellValue))) { foundNonCheckedRows = true; } } catch (FormatException)//convert to bool fails { } } } return foundNonCheckedRows; } }
FIX. RadGridView - exception when binding to entities collection and specifying DataMember under Windows XP
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.
Please refer to the attached sample project. Workaround: public class MyGridCheckBoxCellElement : GridCheckBoxCellElement { public MyGridCheckBoxCellElement(GridViewColumn column, GridRowElement row) : base(column, row) { } protected override Type ThemeEffectiveType { get { return typeof(GridCheckBoxCellElement); } } public override bool IsCompatible(GridViewColumn data, object context) { GridViewCheckBoxColumn col = data as GridViewCheckBoxColumn; if (col != null) { return col.ThreeState == ((RadCheckBoxEditor)this.Editor).ThreeState; } return base.IsCompatible(data, context); } } private void radGridView1_CreateCell(object sender, GridViewCreateCellEventArgs e) { if (e.CellType == typeof(GridCheckBoxCellElement)) { e.CellElement = new MyGridCheckBoxCellElement(e.Column, e.Row); } }
To reproduce: -Create a new ColumnGroupsViewDefinition and pin the first group. - Asign the view to the grid. Workaround: Pin the group after the view is asigned.
How to reproduce: public partial class Form1 : Form { public Form1() { InitializeComponent(); this.radGridView1.DataSource = this.GetData(); this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.RightToLeft = System.Windows.Forms.RightToLeft.Yes; foreach (var col in this.radGridView1.Columns) { col.HeaderTextAlignment = ContentAlignment.MiddleLeft; } } private DataTable GetData() { DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Date", typeof(DateTime)); dt.Columns.Add("Bool", typeof(bool)); dt.Columns.Add("Bool1", typeof(bool)); dt.Columns.Add("Bool2", typeof(bool)); for (int i = 0; i < 50; i++) { dt.Rows.Add("Name " + i, DateTime.Now.AddMinutes(i), i % 2 == 0 ? true : false, false, false); } return dt; } private void radButton1_Click(object sender, EventArgs e) { this.radGridView1.PrintPreview(); } } Workaround: public partial class Form1 : Form { public Form1() { InitializeComponent(); this.radGridView1.DataSource = this.GetData(); this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.RightToLeft = System.Windows.Forms.RightToLeft.Yes; this.radGridView1.PrintCellFormatting += radGridView1_PrintCellFormatting; foreach (var col in this.radGridView1.Columns) { col.HeaderTextAlignment = ContentAlignment.MiddleLeft; } } private void radGridView1_PrintCellFormatting(object sender, PrintCellFormattingEventArgs e) { if (e.Row is GridViewTableHeaderRowInfo && this.radGridView1.RightToLeft == System.Windows.Forms.RightToLeft.Yes) { e.PrintCell.TextAlignment = ContentAlignment.MiddleRight; } } private DataTable GetData() { DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Date", typeof(DateTime)); dt.Columns.Add("Bool", typeof(bool)); dt.Columns.Add("Bool1", typeof(bool)); dt.Columns.Add("Bool2", typeof(bool)); for (int i = 0; i < 50; i++) { dt.Rows.Add("Name " + i, DateTime.Now.AddMinutes(i), i % 2 == 0 ? true : false, false, false); } return dt; } private void radButton1_Click(object sender, EventArgs e) { this.radGridView1.PrintPreview(); } }
Workaround: subscribe to the PageChanged event and update the scroll range. private void RadGridView1_PageChanged(object sender, EventArgs e) { this.RadGridView1.TableElement.RowScroller.UpdateScrollRange(); }
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: - Add a ColumnGroupsViewDefinition protected override void OnShown(EventArgs e) { base.OnShown(e); VisualStudio2012LightTheme theme = new VisualStudio2012LightTheme(); Telerik.WinControls.ThemeResolutionService.ApplicationThemeName = theme.ThemeName; this.radGridView1.BestFitColumns(); } Workaround: protected override void OnShown(EventArgs e) { base.OnShown(e); this.radGridView1.BestFitColumns(); VisualStudio2012LightTheme theme = new VisualStudio2012LightTheme(); Telerik.WinControls.ThemeResolutionService.ApplicationThemeName = theme.ThemeName; }
To reproduce: - Add a grid to a split panel. - Edit a cell and resize the panel without ending the edit. - Click back in the same cell. Workaround: private void RadGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e) { BaseGridEditor editor = e.ActiveEditor as BaseGridEditor; var element = editor.EditorElement as RadTextBoxEditorElement; if (element != null) { element.TextBoxItem.HostedControl.LostFocus -= HostedControl_LostFocus; element.TextBoxItem.HostedControl.LostFocus += HostedControl_LostFocus; } } private void HostedControl_LostFocus(object sender, EventArgs e) { this.RadGridView1.EndEdit(); }
To reproduce: - Bind the grid to a list of the following objects: public class Test { private Status _Status = Status.Value1; public Status Status { get { return _Status; } set { _Status = value; } } private string _Name = ""; public string Name { get { return _Name; } set { _Name = value; } } } public enum Status { Value1, Value2, Value3 } - Group Name column. - Open at least one group. - Close grouping. - Group status column. - Try to open status group. Workaround: GridViewComboBoxColumn col = radGridView1.Columns[0] as GridViewComboBoxColumn; col.DisplayMemberSort = true;
Please refer to the attached sample project and follow the steps illustrated on the attached gif file. Workaround: subscribe to the CellBeginEdit event and focus the grid: public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); this.radGridView1.CellBeginEdit += radGridView1_CellBeginEdit; } private void radGridView1_CellBeginEdit(object sender, GridViewCellCancelEventArgs e) { this.radGridView1.Focus(); } }
To reproduce: - Create a new Visual Studio project with a single form. - Add a RadGridView control to the form. - Add a child Template to the RadGridView. - In the properties of this child template, enable AutoExpand Groups. - Close the form editor and re-open.
To reproduce: - Set the row height to 1000. - Call the grid PrintPreview method. As workaround one can set the MaxHeight of the rows prior printing.
To reproduce: 1. Add a UserControl and drop a RadGridView in it. 2. Use the following code: public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); ColumnGroupsViewDefinition view = new ColumnGroupsViewDefinition(); this.radGridView1.ViewDefinition = view; view.ColumnGroups.Add(new GridViewColumnGroup("Group")); view.ColumnGroups[0].Rows.Add(new GridViewColumnGroupRow() ); GridViewTextBoxColumn col = new GridViewTextBoxColumn("Col1"); this.radGridView1.Columns.Add(col); view.ColumnGroups[0].Rows[0].ColumnNames.Add("Col1"); } } 3. Drag the UserControl from the Toolbox to the form. Workaround: set the ViewDefinition property after all columns are added.
To reproduce: - Show a message box in the CellValidating event handler. - Start the application, edit a cell and directly press the vertical scroll bottom arrow.
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.
The GridViewNewRowInfo is in modified state when the DefaultValuesNeeded event is used. This causes the UserAddingRow event to be fired. Workaround: void radGridView1_DefaultValuesNeeded(object sender, GridViewRowEventArgs e) { e.Row.Cells["SearchType"].Value = "BI"; FieldInfo fieldInfo = typeof(GridViewRowInfo).GetField("state", BindingFlags.NonPublic | BindingFlags.Instance); BitVector32 state = (BitVector32)fieldInfo.GetValue(e.Row); state[2] = false; fieldInfo.SetValue(e.Row, state); e.Row.InvalidateRow(); }
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(); } }