To reproduce: Download the attached files. One contains a project with TelerikDataAccess, the other one contains the SQL script to create the database. Before starting the project notice the column with header text "column1". You will see that its expression is as follows: "Player.Person.FirstName+\",\"+Player.Person.LastName". Starting the project at this point will not produce an exception. Change the name of the column to FirstName and start the project, you will see the stack overflow exception.
To reproduce: Add a row to RadGridView and select it. Then remove it from the rows. Check the SelectedRows collection and you will see that the row is inside. The collection should not contain removed rows and the SelectionChanged event should be fired when a selected row is removed. Workaround: Set the IsSelected property of the row to false prior removing it.
To reproduce:
Open the examples and navigate to GridView -> RightToLeft and toggle on RightToLeft. You will see that the GridGroupHeaderRowElements will have its text LeftToRight.
Workaround:
Use ViewCellFormatting:
private void Grid_ViewCellFormatting15(object sender, CellFormattingEventArgs e)
{
if (e.CellElement.RowElement is GridGroupHeaderRowElement && e.CellElement.RowElement.Children.Any() && e.CellElement.RowElement.Children.Last() is GridGroupContentCellElement)
{
(e.CellElement.RowElement.Children.Last() as GridGroupContentCellElement).TextAlignment = System.Drawing.ContentAlignment.MiddleRight;
}
}
To reproduce: - Set EnterKeyMode to EnterMovesToNextRow. - Enter an invalid value in the first cell and press enter two times. - Enter valid value and press enter again. - You will notice that the current row is moved appropriately.
To reproduce:
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products)
Dim menu As New ContextMenu()
For index = 1 To 4
menu.MenuItems.Add("item" & index)
Next
Me.ContextMenu = menu
End Sub
Workaround:
Const WM_CONTEXTMENU As Integer = &H7B
Public Class Grid
Inherits RadGridView
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = WM_CONTEXTMENU Then
Return
End If
MyBase.WndProc(m)
End Sub
Public Overrides Property ThemeClassName As String
Get
Return GetType(RadGridView).FullName
End Get
Set(value As String)
MyBase.ThemeClassName = value
End Set
End Property
End Class
To reproduce: -Add GridViewMaskBoxColumn to a grid. -Set the Mask type to Regex and set any mask you want. -When you leave the cell NullRefernceException is thrown.
To reproduce:
1. Add a RadGridView and bind it to Northwind.Products table.
2. Use the following code:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products)
For Each col As GridViewColumn In Me.RadGridView1.Columns
If Not col.HeaderText = "SupplierID" AndAlso Not col.HeaderText = "ProductID" Then
col.ReadOnly = True
End If
Next
Me.RadGridView1.AddNewRowPosition = SystemRowPosition.Bottom
End Sub
Private Sub RadGridView1_CellValidating(sender As Object, e As CellValidatingEventArgs) Handles RadGridView1.CellValidating
If e.Value Is Nothing Then
If MessageBox.Show("Incorrect", "error", MessageBoxButtons.OKCancel) = Windows.Forms.DialogResult.OK Then
e.Cancel = True
End If
End If
End Sub
3. Run the project and go to the new row ,cell "SupplierID".
4. Clear the value and press Tab key. As a result the message box for error indication is shown twice.
Workaround:
'register the custom row behavior
Dim gridBehavior As BaseGridBehavior = TryCast(RadGridView1.GridBehavior, BaseGridBehavior)
gridBehavior.UnregisterBehavior(GetType(GridViewNewRowInfo))
gridBehavior.RegisterBehavior(GetType(GridViewNewRowInfo), New MyNewRowBehavior())
Me.RadGridView1.GridViewElement.Navigator = New MyGridNavigator()
Public Class MyNewRowBehavior
Inherits GridNewRowBehavior
Protected Overrides Function ProcessTabKey(keys As KeyEventArgs) As Boolean
If Me.GridControl.AddNewRowPosition = SystemRowPosition.Bottom AndAlso _
Me.GridControl.IsInEditMode AndAlso Me.GridViewElement.Navigator.IsLastColumn(GridViewElement.CurrentColumn) Then
Me.GridControl.Tag = "SuspendValidation"
End If
Return MyBase.ProcessTabKey(keys)
End Function
End Class
Public Class MyGridNavigator
Inherits BaseGridNavigator
Public Overrides Function SelectFirstColumn() As Boolean
If Me.GridViewElement.GridControl.Tag = "SuspendValidation" Then
Me.GridViewElement.GridControl.Tag = Nothing
Return False
End If
Return MyBase.SelectFirstColumn()
End Function
End Class
To reproduce:
1. Add a RadGridView and a RadButton.
2. Enable paging.
3. Use the code snippet below:
private void Form1_Load(object sender, EventArgs e)
{
this.ordersTableAdapter.Fill(this.nwindDataSet.Orders);
bs.DataSource = this.ordersBindingSource;
this.radGridView1.DataSource = bs;
}
BindingSource bs = new BindingSource();
private void radButton1_Click(object sender, EventArgs e)
{
bs.Filter ="ShipName LIKE '%z%'";
}
4. Navigate to page 80 and click the button.
5. You have only 4 pages available , but you are still positioned on page 80.
Workaround:
private void radButton1_Click(object sender, EventArgs e)
{
bs.Filter ="ShipName LIKE '%z%'";
if (this.radGridView1.MasterTemplate.PageIndex>this.radGridView1.MasterTemplate.TotalPages)
{
this.radGridView1.MasterTemplate.MoveToFirstPage();
}
}
Currently one cannot set the column chooser items properties permanently since they are recreated every time the chooser is shown or item is added/removed. Resolution: You can subscribe to the ColumnChooserItemElementCreating event and edit the column chooser items.
To reproduce:
Setup RadGridView as follows:
this.Grid.MasterTemplate.EnablePaging = true;
this.Grid.Columns.Add("");
this.Grid.Columns.Add("");
this.Grid.Columns.Add("");
this.Grid.Columns.Add("");
On a button click add rows:
private void Button_Clic9k(object sender, EventArgs e)
{
for (int i = 0; i < 120; i++)
{
this.Grid.Rows.AddNew();
}
}
You will see a vertical scrollbar when it is not needed.
Workaround:
Wrap the loop in a Begin/EndUpdate calls:
private void Button_Clic9k(object sender, EventArgs e)
{
this.Grid.BeginUpdate();
for (int i = 0; i < 120; i++)
{
this.Grid.Rows.AddNew();
}
this.Grid.EndUpdate();
}
When RadGridView is in right to left mode and the data is grouped, the layout of the items that represent the group field names is incorrect - the close button overlays the text.
WORKAROUND:
public Form83()
{
new RadControlSpyForm().Show();
InitializeComponent();
this.radGridView1.GroupByChanged += radGridView1_GroupByChanged;
}
void radGridView1_GroupByChanged(object sender, Telerik.WinControls.UI.GridViewCollectionChangedEventArgs e)
{
foreach (GroupFieldElement fieldElement in this.radGridView1.GridViewElement.GroupPanelElement.GetDescendants(
delegate(RadElement element) { return element is GroupFieldElement; }, Telerik.WinControls.TreeTraversalMode.BreadthFirst))
{
fieldElement.TextAlignment = ContentAlignment.MiddleRight;
}
}
To reproduce:
DataTable dt = new DataTable();
public Form1()
{
InitializeComponent();
this.radGridView1.EnableFiltering = true;
this.radGridView1.ShowHeaderCellButtons = true;
this.radGridView1.Relations.AddSelfReference(this.radGridView1.MasterTemplate, "ID", "ParentID");
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("ParentID", typeof(int));
for (int i = 1; i <= 5; i++)
{
dt.Rows.Add(i, "Parent." + i, 0);
}
Random rand = new Random();
for (int i = 6; i < 20; i++)
{
dt.Rows.Add(i, "Child." + i, rand.Next(1, 6));
}
for (int i = 20; i < 40; i++)
{
dt.Rows.Add(i, "SubChild." + i, rand.Next(6, 20));
}
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
}
To reproduce:
1.Add a RadGridView and add twelve columns at design time.
2.Enable filtering and use the following code:
public Form1()
{
InitializeComponent();
radGridView1.MasterTemplate.MultiSelect = true;
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (var column in radGridView1.Columns)
{
column.Width = 100;
}
}
3.When you run the application, click over the filtering cell for the 3rd column. Type in some text and click the filter button. As a result the horizontal scroll bar is positioned at right most.
Workaround:
radGridView1.MouseDown += radGridView1_MouseDown;
radGridView1.TableElement.HScrollBar.ValueChanged += HScrollBar_ValueChanged;
int scrollBarValue = 0;
bool shouldResetValue = false;
private void radGridView1_MouseDown(object sender, MouseEventArgs e)
{
RadElement clickecElement = this.radGridView1.ElementTree.GetElementAtPoint(e.Location);
GridFilterRowElement filterRowElement = clickecElement.FindAncestor<GridFilterRowElement>();
GridNewRowElement newRowElement = clickecElement.FindAncestor<GridNewRowElement>();
if (clickecElement is GridFilterRowElement || clickecElement is GridNewRowElement ||
filterRowElement != null || newRowElement != null)
{
shouldResetValue = true;
}
else
{
shouldResetValue = false;
}
scrollBarValue = this.radGridView1.TableElement.HScrollBar.Value;
}
private void HScrollBar_ValueChanged(object sender, EventArgs e)
{
if (shouldResetValue)
{
this.radGridView1.TableElement.HScrollBar.Value = scrollBarValue;
}
}
If one sets AutoSizeRows to true and AllowSearchRow to true the layout of RadGridView throws an exception.
Resolution: Please use the following code snippet to replace RadGridViewDragDropService: this.radGridView1.GridViewElement.RegisterService(new CustomDragDropService(this.radGridView1.GridViewElement));
To reproduce:
Use the code snippet below:
static DataSet ds;
public form1()
{
InitializeComponent();
GridviewStyling(radGridView1);
ds = PrepareDataset();
BuildGrid();
//Set_Hierarchy();
for (int i = 0; i < radGridView1.Templates.Count; i++)
GridviewTemplateStyling(radGridView1.Templates[i]);
this.radGridView1.TableElement.PageViewMode = PageViewMode.ExplorerBar;
this.radGridView1.ViewCellFormatting += radGridView1_ViewCellFormatting;
}
void radGridView1_ViewCellFormatting(object sender, CellFormattingEventArgs e)
{
GridDetailViewCellElement detailCell = e.CellElement as GridDetailViewCellElement;
if (detailCell != null)
{
GridViewHierarchyRowInfo hierarchyRow = (GridViewHierarchyRowInfo)((GridViewDetailsRowInfo)detailCell.RowInfo).Owner;
detailCell.PageViewElement.Header.Visibility = Telerik.WinControls.ElementVisibility.Collapsed;
RadPageViewElement el = detailCell.PageViewElement as RadPageViewExplorerBarElement;
if (el != null)
{
for (int i = 0; i < el.Items.Count; i++) // detailCell.PageViewElement.Items.Count
{
RadPageViewItem item = detailCell.PageViewElement.Items[i];
GridViewInfo viewInfo = hierarchyRow.Views[i];
item.MaxSize = new Size(0, 1);
item.Visibility = Telerik.WinControls.ElementVisibility.Hidden;
if (viewInfo.ChildRows.Count != 0)
{
item.Visibility = Telerik.WinControls.ElementVisibility.Collapsed;
}
}
}
}
}
private DataSet PrepareDataset()
{
Random r = new Random();
DataSet ds = new DataSet("DS");
//snir
DataTable dtFirst = new DataTable("Snir");
dtFirst.Columns.Add("pId", typeof(int));
dtFirst.Columns.Add("Col1", typeof(int));
dtFirst.Columns.Add("Col", typeof(string));
dtFirst.Columns.Add("Col3", typeof(int));
dtFirst.Columns.Add("Col4", typeof(string));
for (int i = 0; i < 5; i++)
dtFirst.Rows.Add(1, i, "snirsnirsnir" + r.Next(0, 100).ToString(),
r.Next(0, 35), "snir" + r.Next(0, 100).ToString());
// jenny
DataTable dtSecond = new DataTable("Jenny");
dtSecond.Columns.Add("pId", typeof(int));
dtSecond.Columns.Add("Col1", typeof(int));
dtSecond.Columns.Add("Col2", typeof(string));
dtSecond.Columns.Add("Col3", typeof(int));
dtSecond.Columns.Add("Col4", typeof(string));
dtSecond.Columns.Add("Col5", typeof(string));
dtSecond.Columns.Add("Col6", typeof(string));
for (int i = 0; i < 5; i++)
dtSecond.Rows.Add(2, i, "CnC" + r.Next(0, 100).ToString(),
r.Next(0, 35), "jenny" + r.Next(0, 100).ToString(), "col5", "col6");
//index
DataTable table1 = new DataTable("Index");
table1.Columns.Add("TableId", typeof(int));
table1.Columns.Add("TableName", typeof(string));
table1.Columns.Add("UpdateType", typeof(int));
table1.Rows.Add(1, dtFirst.TableName, r.Next(0, 3));
table1.Rows.Add(2, dtSecond.TableName, r.Next(0, 3));
ds.Tables.AddRange(new DataTable[] { table1, dtFirst, dtSecond });
return ds;
}
private void BuildGrid()
{
// bind the master template
this.radGridView1.DataSource = ds;
this.radGridView1.DataMember = "Index";
//templates
GridViewTemplate template1 = new GridViewTemplate();
template1.DataSource = ds.Tables[1];
template1.Columns[0].IsVisible = false;
template1.EnableHierarchyFiltering = false;
template1.ShowGroupedColumns = false;
radGridView1.Templates.Add(template1);
GridViewTemplate template2 = new GridViewTemplate();
template2.DataSource = ds.Tables[2]; // 1:snir // 2:jenny
radGridView1.Templates.Add(template2);
template1.AllowDragToGroup = false;
//relations
GridViewRelation relation1 = new GridViewRelation(radGridView1.MasterTemplate);//, template2);
relation1.RelationName = "myRelation1";
relation1.ChildTemplate = radGridView1.Templates[0];
relation1.ChildColumnNames.AddRange(new string[] { "pId" });
relation1.ParentColumnNames.Add("TableId");
radGridView1.Relations.Add(relation1);
GridViewRelation relation2 = new GridViewRelation(radGridView1.MasterTemplate);//, template2);
relation2.RelationName = "myRelation2";
relation2.ChildTemplate = radGridView1.Templates[1];
relation2.ChildColumnNames.AddRange(new string[] { "pId" });
relation2.ParentColumnNames.Add("TableId");
radGridView1.Relations.Add(relation2);
}
private void GridviewStyling(RadGridView rgv)
{
//radGridView1 styling
rgv.AllowAddNewRow = false;
rgv.EnableGrouping = false;
rgv.AllowDragToGroup = false;
rgv.AllowDrop = false;
rgv.AllowEditRow = false;
rgv.AllowDrop = false;
rgv.AllowRowResize = false;
rgv.AllowColumnResize = false;
rgv.AutoExpandGroups = true;
rgv.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
rgv.EnableCustomGrouping = false;
rgv.ShowColumnHeaders = true;
rgv.ShowRowHeaderColumn = false;
rgv.ShowGroupPanel = false;
}
private void GridviewTemplateStyling(GridViewTemplate gvt)
{
//template styling
gvt.AllowAddNewRow = false;
gvt.Columns[0].IsVisible = false;
gvt.ShowChildViewCaptions = false;
gvt.AllowDragToGroup = false;
gvt.AllowRowResize = false;
gvt.AllowColumnResize = false;
gvt.AutoExpandGroups = true;
gvt.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
gvt.ShowRowHeaderColumn = false;
gvt.ShowColumnHeaders = true;
}
private string GetEnumString(int n)
{
switch (n)
{
case (int)TableUpdateModeEnum.INSERT:
return "INSERT";
case (int)TableUpdateModeEnum.UPDATE:
return "UPDATE";
case (int)TableUpdateModeEnum.UPDATE_OR_INSERT:
return "UPDATE/DELETE";
case (int)TableUpdateModeEnum.DELETE_OR_INSERT:
return "INSERT/DELETE";
default:
return "";
}
}
public enum TableUpdateModeEnum
{
[Description("Snir")]
INSERT = 0,
[Description("Liraz")]
UPDATE_OR_INSERT = 1,
[Description("Jenny")]
UPDATE = 2,
[Description("Tsuria")]
DELETE_OR_INSERT = 3
};
Scenario:
1.Expand a master row.
2.Start dragging columns from the child template.
3.When your are dragging over the thick border , the exception occur.
To reproduce: - Add the following column to a blank grid and new row or edit the existing one: GridViewMaskBoxColumn maskBoxColumn = new GridViewMaskBoxColumn(); maskBoxColumn.Name = "Dates"; maskBoxColumn.HeaderText = "Dates"; maskBoxColumn.MaskType = MaskType.FreeFormDateTime; maskBoxColumn.DataType = typeof(System.DateTime); radGridView1.MasterTemplate.Columns.Add(maskBoxColumn); this.radGridView1.Rows.Add(DateTime.Now.AddDays(5));
To reproduce: Add a RadGridView with some data and enable the paging functionality. Also set the AutoSize property to true: grid.EnablePaging = true; grid.AutoSize = true; Start the application and you will see that when you try to edit the textbox with the number of the page you will not be able to. Workaround: Set the AutoSize property to false and use MinimumSize instead: grid.AutoSize = false; grid.MinimumSize = new Size(600, 500);
RadGridView, TextBoxColumn - add support for autocomplete.