Hello,
I use:
- Q3 2010 version 2010.3.10.1215
- Windows 7, Visual Studio 2010, .net framework 4
I try to evaluate RadGridView but with simple file explorer (hierarchy, self reference, unbound mode, load on demand/expansion) and I get exceptions.
I isolate problems
to simple file explorer. Cound You help me to solve these problems ?
1. Add rows in begin/end section after expanded event.
Is it necessary to add rows in statements begin/end ?
If I do it, I get exception
System.NullReferenceException was unhandled Message=Object reference not set to an instance of an object. Source=Telerik.WinControls StackTrace: at Telerik.WinControls.RadObject.RaisePropertyNotifications(RadPropertyValue propVal, Object oldValue, Object newValue, ValueSource oldSource) at Telerik.WinControls.RadObject.SetValueCore(RadPropertyValue propVal, Object propModifier, Object newValue, ValueSource source) at Telerik.WinControls.RadElement.SetValueCore(RadPropertyValue propVal, Object propModifier, Object newValue, ValueSource source) at Telerik.WinControls.RadObject.OnTwoWayBoundPropertyChanged(PropertyBinding binding, Object newValue) at Telerik.WinControls.PropertyBinding.UpdateSourceProperty(Object newValue) at Telerik.WinControls.RadPropertyValue.SetLocalValue(Object value) at Telerik.WinControls.RadObject.SetValueCore(RadPropertyValue propVal, Object propModifier, Object newValue, ValueSource source) at Telerik.WinControls.RadElement.SetValueCore(RadPropertyValue propVal, Object propModifier, Object newValue, ValueSource source) at Telerik.WinControls.UI.GridExpanderItem.set_Expanded(Boolean value) at Telerik.WinControls.UI.GridExpanderItem.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.RadElement.OnCLREventsRise(RoutedEventArgs args) at Telerik.WinControls.RadElement.OnBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadItem.OnBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e) at Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.UI.RadGridView.OnMouseUp(MouseEventArgs e) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at Telerik.WinControls.RadControl.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at TelerikRadControlsWinFormsPrototype.Program.Main() in D:\rdawidziuk\src\OSS 12.2\Support\Prototypes\Technology\Presentation\TelerikRadControlsWinFormsPrototype\Program.cs:line 19 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: 2. During keyboard manipulate:
- enter - expand
- selected cell chage with arrow keys
i get exception. It takes some time, but after minutes I always get this exception:
System.NullReferenceException was unhandled Message=Object reference not set to an instance of an object. Source=Telerik.WinControls.GridView StackTrace: at Telerik.WinControls.UI.GridTraverser.StepInHierarchyBackward() at Telerik.WinControls.UI.GridTraverser.MovePreviousCore() at Telerik.WinControls.UI.GridTraverser.MovePrevious() at Telerik.WinControls.UI.BaseGridNavigator.MoveToNextRow(Int32 step, Boolean moveNextDirection) at Telerik.WinControls.UI.BaseGridNavigator.SelectPreviousColumn() at Telerik.WinControls.UI.GridRowBehavior.ProcessLeftKey(KeyEventArgs keys) at Telerik.WinControls.UI.GridRowBehavior.ProcessKey(KeyEventArgs keys) at Telerik.WinControls.UI.BaseGridBehavior.ProcessKey(KeyEventArgs keys) at Telerik.WinControls.UI.BaseGridBehavior.ProcessKeyDown(KeyEventArgs keys) at Telerik.WinControls.UI.RadGridView.OnKeyDown(KeyEventArgs e) at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m) at System.Windows.Forms.Control.ProcessKeyMessage(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at Telerik.WinControls.RadControl.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at TelerikRadControlsWinFormsPrototype.Program.Main() in D:\rdawidziuk\src\OSS 12.2\Support\Prototypes\Technology\Presentation\TelerikRadControlsWinFormsPrototype\Program.cs:line 19 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: 3. After column order change I get strange look columnorderchange.png
My file explorer code:
using System;using System.Collections.Generic;using System.Drawing;using System.Windows.Forms;using Telerik.WinControls;using Telerik.WinControls.UI;using System.IO;namespace TelerikRadControlsWinFormsPrototype{ public partial class MyFileSystemExplorer : Telerik.WinControls.UI.RadForm { private int idCounter = 0; public MyFileSystemExplorer() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // grid initialize this.radGridView1.CellFormatting += new CellFormattingEventHandler(radGridView1_CellFormatting); this.radGridView1.ChildViewExpanded += new ChildViewExpandedEventHandler(radGridView1_ChildViewExpanded); this.radGridView1.Relations.AddSelfReference(this.radGridView1.MasterTemplate, "ID", "ParentID"); this.radGridView1.ImageList = this.imageList1; this.radGridView1.TableElement.RowHeight = 35; // colums GridViewDataColumn idCol = new GridViewDecimalColumn(); idCol.DataType = typeof(int); idCol.Name = "ID"; idCol.ReadOnly = true; idCol.IsVisible = false; this.radGridView1.Columns.Add(idCol); GridViewDataColumn parentIdCol = new GridViewDecimalColumn(); parentIdCol.DataType = typeof(int); parentIdCol.Name = "ParentID"; parentIdCol.ReadOnly = true; parentIdCol.IsVisible = false; this.radGridView1.Columns.Add(parentIdCol); GridViewDataColumn nameCol = new GridViewTextBoxColumn(); nameCol.DataType = typeof(string); nameCol.Name = "Name"; nameCol.HeaderText = "Name"; nameCol.ReadOnly = true; this.radGridView1.Columns.Add(nameCol); GridViewDataColumn modiffCol = new GridViewTextBoxColumn(); modiffCol.DataType = typeof(DateTime); modiffCol.Name = "Creation"; modiffCol.HeaderText = "Creation"; modiffCol.ReadOnly = true; this.radGridView1.Columns.Add(modiffCol); // root rows List<FileSystemInfoWrp> drivesInfo = new List<FileSystemInfoWrp>(); foreach (DriveInfo di in DriveInfo.GetDrives()) { drivesInfo.Add(new FileSystemInfoWrp(this.idCounter++, di.RootDirectory)); } this.Add(null, drivesInfo.ToArray()); } void radGridView1_ChildViewExpanded(object sender, ChildViewExpandedEventArgs e) { if (e.IsExpanded) { FileSystemInfoWrp parent = (FileSystemInfoWrp)e.ParentRow.Tag; // adding in begin/end update section invokes NullReferenceException, why ? //this.radGridView1.BeginUpdate(); try { this.Add(parent, this.GetFileSystemElements(parent)); } finally { //this.radGridView1.EndUpdate(); } this.radGridView1.GridNavigator.SelectRow(e.ParentRow); } else { // remove child nodes, always read files from hdd foreach(GridViewRowInfo gvri in e.ParentRow.ChildRows) { this.radGridView1.Rows.Remove(gvri); } } } void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e) { GridDataCellElement cell = e.CellElement as GridDataCellElement; if (cell != null && cell.ExpanderItem != null) { cell.ImageAlignment = ContentAlignment.MiddleLeft; cell.ExpanderItem.Alignment = ContentAlignment.MiddleLeft; if (((FileSystemInfoWrp)e.Row.Tag).ElementInfo is DirectoryInfo) { if (e.Row.IsExpanded) { cell.Image = this.imageList1.Images[1]; } else cell.Image = this.imageList1.Images[0]; cell.ExpanderItem.Visibility = ElementVisibility.Visible; } else { cell.Image = this.imageList1.Images[2]; cell.ExpanderItem.Visibility = ElementVisibility.Hidden; } cell.TextImageRelation = TextImageRelation.ImageBeforeText; } } private FileSystemInfoWrp[] GetFileSystemElements(FileSystemInfoWrp root) { List<FileSystemInfoWrp> result = new List<FileSystemInfoWrp>(); if (root.ElementInfo is DirectoryInfo) { try { FileSystemInfo[] infos = ((DirectoryInfo)root.ElementInfo).GetFileSystemInfos(); foreach (FileSystemInfo fi in infos) { result.Add(new FileSystemInfoWrp(this.idCounter++, fi)); } } catch // omits io exception { } } return result.ToArray(); } private void Add(FileSystemInfoWrp parent, FileSystemInfoWrp[] fileInfos) { foreach (FileSystemInfoWrp fsiw in fileInfos) { GridViewRowInfo row = this.radGridView1.Rows.AddNew(); row.Cells["ID"].Value = fsiw.Id; if (parent != null) row.Cells["ParentID"].Value = parent.Id; row.Cells["Name"].Value = fsiw.ElementInfo.Name; row.Cells["Creation"].Value = fsiw.ElementInfo.CreationTime; row.Tag = fsiw; } } } public class FileSystemInfoWrp { public int Id { get; set; } public FileSystemInfo ElementInfo { get; set; } public FileSystemInfoWrp(int id, FileSystemInfo elementInfo) { this.Id = id; this.ElementInfo = elementInfo; } }}designer:
using TelerikRadControlsWinFormsPrototype.Properties;namespace TelerikRadControlsWinFormsPrototype{ partial class MyFileSystemExplorer { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MyFileSystemExplorer)); this.radGridView1 = new Telerik.WinControls.UI.RadGridView(); this.imageList1 = new System.Windows.Forms.ImageList(this.components); ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this)).BeginInit(); this.SuspendLayout(); // // radGridView1 // this.radGridView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); this.radGridView1.Dock = System.Windows.Forms.DockStyle.Fill; this.radGridView1.ForeColor = System.Drawing.Color.Black; this.radGridView1.Location = new System.Drawing.Point(0, 0); // // radGridView1 // this.radGridView1.MasterTemplate.AllowColumnChooser = false; this.radGridView1.MasterTemplate.AutoGenerateColumns = false; this.radGridView1.MasterTemplate.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill; this.radGridView1.MasterTemplate.Caption = null; this.radGridView1.MasterTemplate.MultiSelect = true; this.radGridView1.MasterTemplate.ShowGroupedColumns = true; this.radGridView1.Name = "radGridView1"; // // // this.radGridView1.RootElement.ForeColor = System.Drawing.Color.Black; this.radGridView1.Size = new System.Drawing.Size(1216, 786); this.radGridView1.TabIndex = 2; this.radGridView1.Text = "radGridView1"; this.radGridView1.ThemeName = "Telerik"; // // imageList1 // this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); this.imageList1.TransparentColor = System.Drawing.Color.Transparent; this.imageList1.Images.SetKeyName(0, "folder_blue_open1.png"); this.imageList1.Images.SetKeyName(1, "folder1.png"); this.imageList1.Images.SetKeyName(2, "new1.png"); // // MyFileSystemExplorer // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1216, 786); this.Controls.Add(this.radGridView1); this.Name = "MyFileSystemExplorer"; // // // this.RootElement.ApplyShapeToControl = true; this.Text = "My File System Explorer"; this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); this.ResumeLayout(false); } #endregion private Telerik.WinControls.UI.RadGridView radGridView1; private System.Windows.Forms.ImageList imageList1; }}Cound You help me to solve these problems ?
Regards,
Robert