With the current implementation, you can drop a column from the ColumnChooser window into the row. The column will be added to a place that reflects its position in the RadGridView Columns collection.
Use the code below and click the button to make the grid ReadOnly:
public TestForm()
{
InitializeComponent();
GridViewCheckBoxColumn checkBoxColumn = new GridViewCheckBoxColumn("checkbox");
checkBoxColumn.EnableHeaderCheckBox = true;
this.radGridView1.Columns.Add(checkBoxColumn);
this.radGridView1.Columns.Add("text");
this.Shown += TestForm_Shown;
}
private void TestForm_Shown(object sender, EventArgs e)
{
this.radGridView1.Columns["checkbox"].IsVisible = !this.radGridView1.Columns["checkbox"].IsVisible;
}
private void radButton1_Click(object sender, EventArgs e)
{
this.radGridView1.ReadOnly = !this.radGridView1.ReadOnly;
}
To reproduce:
public RadForm1()
{
InitializeComponent();
PopulateGrid();
}
private void radButton1_Click(object sender, EventArgs e)
{
GridViewSpreadExport spreadExporter = new GridViewSpreadExport(this.radGridView1);
SpreadExpo
rtRenderer exportRenderer = new SpreadExportRenderer();
spreadExporter.ExportHierarchy = true;
spreadExporter.ExportVisualSettings = true;
spreadExporter.ChildViewExportMode = Telerik.WinControls.UI.Export.ChildViewExportMode.ExportAllViews;
string fileName = @"..\..\exportedFile" + DateTime.Now.ToLongTimeString().Replace(":", "_") + ".xlsx";
spreadExporter.RunExport(fileName, exportRenderer);
Process.Start(fileName);
}
public void PopulateGrid()
{
List<GridResults.ChildCollectionFirst> firstCollection = new List<GridResults.ChildCollectionFirst>
{
new GridResults.ChildCollectionFirst
{
Test1 = "First Child"
}
}.ToList();
List<GridResults.ChildCollectionSecond> secondCollection = new List<GridResults.ChildCollectionSecond>
{
new GridResults.ChildCollectionSecond
{
Test2 = "Second Child"
}
}.ToList();
List<GridResults.ChildCollectionThird> thirdCollection = new List<GridResults.ChildCollectionThird>
{
new GridResults.ChildCollectionThird
{
Test3 = "Third Child"
}
}.ToList();
List<GridResults.ChildCollectionFourth> fourthCollection = new List<GridResults.ChildCollectionFourth>
{
new GridResults.ChildCollectionFourth
{
Test4 = "Fourth Child"
}
}.ToList();
var resultsList = new List<GridResults>
{
new GridResults
{
Id = "First Parent",
Value = "Test Value 1",
ChildCollection1 = new List<GridResults.ChildCollectionFirst>(),
ChildCollection2 = new List<GridResults.ChildCollectionSecond>(),
ChildCollection3 = new List<GridResults.ChildCollectionThird>(),
ChildCollection4 = new List<GridResults.ChildCollectionFourth>()
},
new GridResults
{
Id = "Second Parent",
Value = "Test Value 2",
ChildCollection1 = firstCollection,
ChildCollection2 = secondCollection,
ChildCollection3 = thirdCollection,
ChildCollection4 = fourthCollection
},
new GridResults
{
Id = "Third Parent",
Value = "Test Value 3",
ChildCollection1 = new List<GridResults.ChildCollectionFirst>(),
ChildCollection2 = new List<GridResults.ChildCollectionSecond>(),
ChildCollection3 = new List<GridResults.ChildCollectionThird>(),
ChildCollection4 = new List<GridResults.ChildCollectionFourth>()
},
new GridResults
{
Id = "Fourth Parent",
Value = "Test Value 4",
ChildCollection1 = new List<GridResults.ChildCollectionFirst>(),
ChildCollection2 = new List<GridResults.ChildCollectionSecond>(),
ChildCollection3 = new List<GridResults.ChildCollectionThird>(),
ChildCollection4 = new List<GridResults.ChildCollectionFourth>()
},
new GridResults
{
Id = "Fifth Parent",
Value = "Test Value 5",
ChildCollection1 = new List<GridResults.ChildCollectionFirst>(),
ChildCollection2 = new List<GridResults.ChildCollectionSecond>(),
ChildCollection3 = new List<GridResults.ChildCollectionThird>(),
ChildCollection4 = new List<GridResults.ChildCollectionFourth>()
},
new GridResults
{
Id = "Sixth Parent",
Value = "Test Value 6",
ChildCollection1 = new List<GridResults.ChildCollectionFirst>(),
ChildCollection2 = new List<GridResults.ChildCollectionSecond>(),
ChildCollection3 = new List<GridResults.ChildCollectionThird>(),
ChildCollection4 = new List<GridResults.ChildCollectionFourth>()
}
};
// radGridView1.BeginUpdate();
radGridView1.DataSource = resultsList;
// radGridView1.EndUpdate();
foreach (GridViewTemplate t in this.radGridView1.Templates)
{
t.AutoSizeColumnsMode= GridViewAutoSizeColumnsMode.Fill;
}
}
public class GridResults
{
[DisplayName("ID")]
public string Id { get; set; }
[DisplayName("Value")]
public string Value { get; set; }
[DisplayName("Child Collection 1")]
public List<ChildCollectionFirst> ChildCollection1 { get; set; }
[DisplayName("Child Collection 2")]
public List<ChildCollectionSecond> ChildCollection2 { get; set; }
[DisplayName("Child Collection 3")]
public List<ChildCollectionThird> ChildCollection3 { get; set; }
[DisplayName("Child Collection 4")]
public List<ChildCollectionFourth> ChildCollection4 { get; set; }
[DisplayName("Child Collection 1")]
public class ChildCollectionFirst
{
[DisplayName("Test Header")]
public string Test1 { get; set; }
}
[DisplayName("Child Collection 2")]
public class ChildCollectionSecond
{
[DisplayName("Test Header 2")]
public string Test2 { get; set; }
}
[DisplayName("Child Collection 3")]
public class ChildCollectionThird
{
[DisplayName("Test Header 3")]
public string Test3 { get; set; }
}
[DisplayName("Child Collection 4")]
public class ChildCollectionFourth
{
[DisplayName("Test Header 4")]
public string Test4 { get; set; }
}
}
The observed result with duplicated rows is demonstrated here:
Enable the ability to MERGE seperate rows (different records), like found in ITunes "Songs" mode where is shows the artwork (then artist,release undernearth) in a custom class, then the related song rows to the right. Your competitor Dev Express has it already in place. See youtube video here : https://www.youtube.com/watch?v=TfPXwE7GcXs Cheers
To reproduce:
public RadForm1()
{
InitializeComponent();
this.radGridView1.Columns.Add("Telerik");
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
for (int i = 0; i < 10; i++)
{
this.radGridView1.Rows.Add(Guid.NewGuid().ToString());
}
}
private void radButton1_Click(object sender, EventArgs e)
{
RadPrintDocument document = new RadPrintDocument();
document.DefaultPageSettings.Landscape = false;
this.radGridView1.PrintPreview(document);
}
Step 1: Open Print Settings dialog:
Step 2: Change the Orientation to Landscape:
Step 3: Click directly the Print button here. Once the default Print dialog is opened choose Preferences:
Step 4: You will notice that the Orientation is still Portrait instead of Landscape:
Code to replicate the issue:
GridPrintStyle style = new GridPrintStyle();
style.PrintHierarchy = true;
style.HierarchyIndent = 0;
style.ChildViewPrintMode = ChildViewPrintMode.SelectViewToPrint;
this.radGridView1.PrintStyle = style;
this.radGridView1.PrintPreview();
The attached gif file illustrates how the 20px hierarchy indent is returned after hitting the preview button.
Steps to reproduce:
1. Bind the grid and enable the search row
2. Enter some search text
3. Delete records from the applied DataSource collection. It may be necessary to perform the delete operation several times before the error occurs.
The error can be reproduced with the following code snippet:
Dim dt As New DataTable
Sub New()
InitializeComponent()
dt.Columns.Add("Id", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
For index = 1 To 10000
dt.Rows.Add(index, Guid.NewGuid.ToString())
Next
Me.RadGridView1.DataSource = dt
Me.RadGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill
Me.RadGridView1.AllowSearchRow = True
End Sub
Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click
For index = 1 To 50
dt.Rows.RemoveAt(0)
Next
End Sub
There is a sample project attached as well and its result is illustrated in the gif file.
Stack trace:
at Telerik.WinControls.UI.MasterGridViewTemplate.set_CurrentRow(GridViewRowInfo value) at Telerik.WinControls.UI.RadGridView.set_CurrentRow(GridViewRowInfo value) at Telerik.WinControls.UI.GridViewSearchRowInfo.SetCurrent(GridSearchResultCellInfo cell) at Telerik.WinControls.UI.GridViewSearchRowInfo.SetCurrent(GridSearchResultCellInfo cell, Boolean checkInvokeRequired) at Telerik.WinControls.UI.GridViewSearchRowInfo.SelectNextSearchResult() at Telerik.WinControls.UI.GridViewSearchRowInfo.Search(String criteria) at Telerik.WinControls.UI.GridViewSearchRowInfo.Telerik.WinControls.UI.IGridViewEventListener.PostProcessEvent(GridViewEvent eventData) at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessCollection(GridViewEvent gridEvent, PriorityWeakReferenceList list, GridEventProcessMode processMode) at Telerik.WinControls.UI.GridViewSynchronizationService.NotifyListeners(GridViewEvent gridEvent) at Telerik.WinControls.UI.GridViewSynchronizationService.FlushEvents() at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewEvent gridEvent) at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewTemplate template, GridViewEvent eventData, Boolean postUI) at Telerik.WinControls.UI.GridViewRowCollection.DispatchDataViewChangedEvent(DataViewChangedEventArgs args, GridEventType type) at Telerik.WinControls.UI.GridViewRowCollection.ListSource_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) at Telerik.WinControls.Data.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) at Telerik.WinControls.Data.RadListSource`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) at Telerik.WinControls.Data.RadListSource`1.RemoveItem(Int32 index) at Telerik.WinControls.Data.RadListSource`1.currencyManager_ListChanged(Object sender, ListChangedEventArgs e) at System.Windows.Forms.CurrencyManager.OnListChanged(ListChangedEventArgs e) at System.Windows.Forms.CurrencyManager.List_ListChanged(Object sender, ListChangedEventArgs e) at System.Windows.Forms.BindingSource.OnListChanged(ListChangedEventArgs e) at System.Windows.Forms.BindingSource.InnerList_ListChanged(Object sender, ListChangedEventArgs e) at System.ComponentModel.BindingList`1.OnListChanged(ListChangedEventArgs e) at System.ComponentModel.BindingList`1.FireListChanged(ListChangedType type, Int32 index) at System.ComponentModel.BindingList`1.RemoveItem(Int32 index) at System.Collections.ObjectModel.Collection`1.Remove(T item) at System.Collections.ObjectModel.Collection`1.System.Collections.IList.Remove(Object value) at System.Windows.Forms.BindingSource.Remove(Object value)
An exception occurs when trying to export the RadGridView using the ExportToPDF class with the following message.
System.SystemException: 'System.MethodAccessException: Attempt by security transparent method 'Telerik.Pdf.Gdi.GdiFontEnumerator.get_FamilyNames()' to call native code through method 'Telerik.WinControls.NativeMethods.EnumFontFamiliesEx(IntPtr, LOGFONT, FontEnumDelegate, Int32, Int32)' failed. Methods must be security critical or security safe-critical to call native code.
at Telerik.Pdf.Gdi.GdiFontEnumerator.get_FamilyNames()
at Telerik.Apoc.Pdf.FontSetup.AddSystemFonts(FontType fontType)
at Telerik.Apoc.Render.Pdf.PdfRenderer.SetupFontInfo(FontInfo fontInfo)
at Telerik.Apoc.Fo.FOTreeBuilder.Parse(XmlReader reader)'
This exception is observed only when the referenced DLLs target the .Net Framework 4.8 version.
The following article shows how to attach the source code to your project:
https://docs.telerik.com/devtools/winforms/knowledge-base/attach-telerik-source-code-to-your-project
When attaching the .NETCore projects (latest version R1 2023) to your application, the project can't be built.
When the font size of the OK and Cancel buttons inside the Excel-like filtering popup is increased, the buttons are cut.
When the GridViewComboBoxColumn is added for the master level, once the FieldName property is set, the DataType is synced with its type:
However, for the child levels, this logic is not executed automatically.
Steps to reproduce:
1. Add a RadGridView with AutoGenerateHierarchy set to true.
2. Set the DataSource to Northwind DataSet and DataMember to Categories:
3. Open the grid's Property Builder and add a combo column for the child level:
4. Set the column's DataSource property.
Expected behavior: DataSource collection is properly set:
Actual behavior: blank property grid with settings for the column:
When paging is enabled in RadGridView and a row is pinned, it is visible among all pages. However, it is possible to paste in it only from the page to which it originally belongs.
Use the following setup:
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (int i = 0; i < 100; i++)
{
dt.Rows.Add(i, "Row" + i);
}
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.ClipboardPasteMode = GridViewClipboardPasteMode.EnableWithNotifications;
this.radGridView1.EnablePaging = true;
1. Copy the entire content of a random row
2. Navigate to another page and pin a row
3. Change the page and try to paste the clipboard content to the pinned row
Expected behavior: the content is successfully pasted no matter of the current page
Actual behavior: the content is pasted only if the use navigates to the page to which the pinned row originally belongs
Use the following setup:
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (int i = 0; i <5; i++)
{
dt.Rows.Add(i, "Row"+i);
}
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.ClipboardPasteMode = GridViewClipboardPasteMode.Enable;
1. Copy the entire content of a random row.
2. Pin another row to the top
3. Paste the clipboard data to the pinned row
Expected result: the content is successfully pasted in the pinned row.
Observed result: the pinned row disappears.
When you use var, object is assumed. Of course, the object contains a GridViewCellInfo, but you have to cast it first to use one of its members.
The goal is to prevent unnecessary casts.