i am getting a null reference exception with the following call stack:
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException
at Telerik.WinControls.UI.TableViewRowLayoutBase.GetRowHeight(Telerik.WinControls.UI.GridViewRowInfo)
at Telerik.WinControls.UI.RowElementProvider.GetElementSize(Telerik.WinControls.UI.GridViewRowInfo)
at Telerik.WinControls.UI.ItemScroller`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].GetScrollHeight(System.__Canon)
at Telerik.WinControls.UI.ItemScroller`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].ScrollDown(Int32)
at Telerik.WinControls.UI.ItemScroller`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].ScrollTo(Int32)
at Telerik.WinControls.UI.ItemScroller`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].scrollbar_ValueChanged(System.Object, System.EventArgs)
at Telerik.WinControls.UI.RadScrollBarElement.OnValueChanged(Int32, Int32)
at Telerik.WinControls.UI.RadScrollBarElement.set_Value(Int32)
at Telerik.WinControls.UI.ItemScroller`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].UpdateScrollValue()
at Telerik.WinControls.UI.ItemScroller`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].UpdateScrollRange()
at Telerik.WinControls.UI.RowScroller.UpdateScrollRange()
at Telerik.WinControls.UI.GridTableElement.UpdateNoDataText()
at Telerik.WinControls.UI.GridTableElement.UpdateAll()
at Telerik.WinControls.UI.GridTableElement.UpdateViewCore(System.Object, Telerik.WinControls.UI.DataViewChangedEventArgs)
at Telerik.WinControls.UI.GridTableElement.UpdateView(System.Object, Telerik.WinControls.UI.DataViewChangedEventArgs)
at Telerik.WinControls.UI.GridTableElement.ProcessTemplateEvent(Telerik.WinControls.UI.GridViewEvent)
at Telerik.WinControls.UI.GridTableElement.Telerik.WinControls.UI.IGridViewEventListener.ProcessEvent(Telerik.WinControls.UI.GridViewEvent)
at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessCollection(Telerik.WinControls.UI.GridViewEvent, Telerik.WinControls.UI.PriorityWeakReferenceList, Telerik.WinControls.UI.GridEventProcessMode)
at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessEvent(Telerik.WinControls.UI.GridViewEvent)
at Telerik.WinControls.UI.GridViewSynchronizationService.NotifyListeners(Telerik.WinControls.UI.GridViewEvent)
at Telerik.WinControls.UI.GridViewSynchronizationService.FlushEvents()
at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(Telerik.WinControls.UI.GridViewEvent)
at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(Telerik.WinControls.UI.GridViewTemplate, Telerik.WinControls.UI.GridViewEvent, Boolean)
at Telerik.WinControls.UI.GridViewTemplate.DispatchEvent(Telerik.WinControls.UI.GridViewEvent, Boolean)
at Telerik.WinControls.UI.GridViewTemplate.DispatchDataViewChangedEvent(System.Object, Telerik.WinControls.UI.DataViewChangedEventArgs)
at Telerik.WinControls.UI.GridViewTemplate.OnViewChanged(System.Object, Telerik.WinControls.UI.DataViewChangedEventArgs)
at Telerik.WinControls.UI.MasterGridViewTemplate.OnViewChanged(System.Object, Telerik.WinControls.UI.DataViewChangedEventArgs)
at Telerik.WinControls.UI.GridViewTemplate.EndUpdate(Boolean, Telerik.WinControls.UI.DataViewChangedEventArgs)
at Telerik.WinControls.UI.MasterGridViewTemplate.EndUpdate(Boolean, Telerik.WinControls.UI.DataViewChangedEventArgs)
at Telerik.WinControls.UI.GridViewTemplate.set_RowCount(Int32)
at Telerik.WinControls.UI.RadGridView.set_RowCount(Int32)
at Communication_Logger.frmCommunicationLogger.RadRibbonForm1_OnDataReceived(Communication_Logger.Data)
at Communication_Logger.ChannelClass.Serial_DataReceived(System.Object, System.IO.Ports.SerialDataReceivedEventArgs)
at System.IO.Ports.SerialPort.CatchReceivedEvents(System.Object, System.IO.Ports.SerialDataReceivedEventArgs)
at System.IO.Ports.SerialStream+EventLoopRunner.CallReceiveEvents(System.Object)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
the setup is a dotNet 4.5.2 winforms application with RadGridView in virtual mode.
The exception occur when the application is left working for days (2 in this case) without any user interaction.
The application normally updates a list that is used by the gridview, the list records are added and removed continuously, the grid view RowCount is updated via a timer.
i suspect that the RowCount reported at one point in time doesn't match the list size as it is trimmed, and therfore the GetRowHeight fails as the data doesn't exist - can this be handled in the gridview - to avoid a termination of the process due to the exception ?
regards,
guy.
RadGridview 1.BestFitColumns(Telerik.WinControls.UI.BestFitColumnMode.HeaderCells)
In this case, the culture of the application is different from the culture of the machine. In this particular case, both cultures have different long date time format strings. current format mm/dd/yyyy compare to the one which the control is loading dd/mm/yyyy.
As a workaround, we can apply InvariantCulture before loading the XML and return the previous one after this:
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
grid.LoadLayout(xml);
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
When the columns are auto-generated, the way to modify the columns is to use the Columns collection. We could expose an event that will be called when the columns are auto-generating. From the event arguments, we could get the newly created column and replace with if needed or modify it. Similar to the CreateRow event of the control.
To reproduce use the code below:
DataTable table = new DataTable();
for (int i = 0; i < 20; i++)
{
table.Columns.Add("Left" + i, typeof(int));
table.Columns.Add("Right" + i, typeof(int));
}
for (int i = 0; i < 27; i++)
{
List<object> parameters = new List<object>();
for (int j = 0; j < table.Columns.Count - 2; j++)
{
parameters.Add(100 * i + i);
}
table.Rows.Add(parameters.ToArray());
}
this.radGridView1.DataSource = table;
ColumnGroupsViewDefinition def = new ColumnGroupsViewDefinition();
for (int i = 0, j = 0; i < 20; i++)
{
var group = new GridViewColumnGroup("Group" + 3 + i);
def.ColumnGroups.Add(group);
group.Groups.Add(new GridViewColumnGroup("0"));
group.Groups[0].Rows.Add(new GridViewColumnGroupRow() { MinHeight = 30});
group.Groups[0].Rows[0].ColumnNames.Add(this.radGridView1.Columns[j].Name);
this.radGridView1.Columns[j].Width = 58;
j++;
group.Groups[0].Rows[0].ColumnNames.Add(this.radGridView1.Columns[j].Name);
this.radGridView1.Columns[j].Width = 58;
j++;
}
radGridView1.MasterTemplate.ShowRowHeaderColumn = false;
this.radGridView1.ViewDefinition = def;
// To Export:
GridViewPdfExport pdfExport = new GridViewPdfExport(this.radGridView1);
pdfExport.FitToPageWidth = false;
pdfExport.ExportViewDefinition = true;
pdfExport.ExportVisualSettings = true;
pdfExport.RunExport(@"..\..\pdf", new PdfExportRenderer());
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:
There is a sample project attached and the result is illustrated below:
200%:
100%:
When typing text in a new row in the RadGridView control with Windows 11 theme, the text appears to be moved down from the top of the row and makes it look like it is hidden, thus making it hard to see.
I am using all the defaults of the RadGridView control with AutoSizeRows = true.
Please refer to the attached sample video.
StackTrace:
Message: Object reference not set to an instance of an object. Telerik.WinControls.UI.RadGridViewDragDropService.GetDragImageHint(ContentAlignment textAlignment, Bitmap hintImage, RectangleF textRectangle, Int32 hintImageWidth) Telerik.WinControls.UI.ColumnChooserItem.GetDragHintCore() Telerik.WinControls.RadItem.Telerik.WinControls.ISupportDrag.GetDragHint() Telerik.WinControls.RadDragDropService.PrepareContext():80 Telerik.WinControls.RadDragDropService.HandleMouseMove(Point mousePos):40 Telerik.WinControls.UI.RadGridViewDragDropService.HandleMouseMove(Point mousePosition):13 Telerik.WinControls.RadDragDropService.Telerik.WinControls.IMessageListener.PreviewMessage(Message& msg):150 Telerik.WinControls.RadMessageFilter.NotifyGetMessageEvent(Message& msg):41 Telerik.WinControls.RadMessageFilter.GetMessageHookProc(Int32 code, IntPtr wParam, IntPtr lParam):36
Code snippet for reproducing the error:
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
for (int i = 0; i < 10; i++)
{
dt.Rows.Add(i, "Row" + i, 0);
}
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewSummaryItem summaryItem = new GridViewSummaryItem();
summaryItem.Name = "Price";
summaryItem.Aggregate = GridAggregateFunction.StDev;
GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem();
summaryRowItem.Add(summaryItem);
this.radGridView1.SummaryRowsBottom.Add(summaryRowItem);
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.