ComboBox column DataSource property is not visible in the Designer MS Property Builder when the previously selected node was RadGridView.
Steps to reproduce:
1.Run the attached sample project.
2.Group by the ProductID column
3.Select Page 4
4. Expand the top group row. You will notice that the grid jumps to a previous row.
Expected:
Actual:
Workaround:
public class CustomGrid : RadGridView
{
public override string ThemeClassName
{
get
{
return typeof(RadGridView).FullName;
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
GridExpanderItem expander = this.ElementTree.GetElementAtPoint(e.Location) as GridExpanderItem;
if (expander != null)
{
flag = true;
}
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
flag = false;
}
bool flag = false;
protected override void OnPageChanging(object sender, PageChangingEventArgs e)
{
if (flag)
{
e.Cancel = true;
}
base.OnPageChanging(sender, e);
}
}
When the RadGridView AutoSize property is set to true and a row is expanded, an exception is thrown:
System.InvalidOperationException: 'MeasureOverride returned positive infinity: Telerik.WinControls.UI.GridDetailViewRowElement'
A possible workaround is to replace the GridDetailViewRowElement with your own class. Then overriding the MeasureOverride method we can pass valid size to the element.
private void RadGridView1_CreateRow(object sender, GridViewCreateRowEventArgs e)
{
if (e.RowInfo is GridViewDetailsRowInfo)
{
e.RowElement = new MyGridDetailViewRowElement();
}
}
public class MyGridDetailViewRowElement : GridDetailViewRowElement
{
protected override SizeF MeasureOverride(SizeF availableSize)
{
var baseSize = base.MeasureOverride(availableSize);
if(baseSize.Width == float.PositiveInfinity)
{
baseSize.Width = 800;
}
return baseSize;
}
}
With releasing .NET 6, there are TimeOnly and DateOnly types which would be more appropriate for managing such values:
https://devblogs.microsoft.com/dotnet/date-time-and-time-zone-enhancements-in-net-6/
It would be good to add support for these types in GridViewDateTimeView.
Currently, the following code gives an exception when entering edit mode:
public RadForm1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("DateOnly", typeof(DateOnly));
dt.Rows.Add(new DateOnly(2022,3,3));
this.radGridView1.AutoGenerateColumns = false;
GridViewDateTimeColumn dateColumn = new GridViewDateTimeColumn();
dateColumn.FieldName = "DateOnly";
this.radGridView1.Columns.Add(dateColumn);
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
}
Workaround: you can use the following custom TypeConverter:
public RadForm1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("DateOnly", typeof(DateOnly));
dt.Rows.Add(new DateOnly(2022,3,3));
this.radGridView1.AutoGenerateColumns = false;
GridViewDateTimeColumn dateColumn = new GridViewDateTimeColumn();
dateColumn.DataType = typeof(DateTime);
dateColumn.FieldName = "DateOnly";
dateColumn.Format = DateTimePickerFormat.Custom;
dateColumn.CustomFormat = "dd/MM/yyyy";
dateColumn.FormatString = "{0:dd/MM/yyyy}";
dateColumn.DataTypeConverter = new DateOnlyConverter();
this.radGridView1.Columns.Add(dateColumn);
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
}
public class DateOnlyConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType == typeof(DateTime);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (value is DateOnly && destinationType == typeof(DateTime))
{
DateOnly date = (DateOnly)value;
return new DateTime(date.Year, date.Month, date.Day);
}
return base.ConvertTo(context, culture, value, destinationType);
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(DateTime) ;
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is DateTime)
{
DateTime date = (DateTime)value;
return new DateOnly(date.Year, date.Month, date.Day);
}
return base.ConvertFrom(context, culture, value);
}
}
Please refer to the sample project and open the Home form. The attached gif file illustrates how to reproduce the error.
Workaround: define the grid relations via code.
Use this XML layout:
this.radGridView1.LoadLayout(@"..\..\..\Layout.xml");
<RadGridView Padding="0, 0, 0, 1" Cursor="Default" TabIndex="49">
<MasterTemplate EnableGrouping = "True" AllowEditRow="False" AllowDeleteRow="False" AllowAddNewRow="False" EnableFiltering="True" AutoExpandGroups="True">
<Columns>
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="100" FieldName="JobID" Name="JobID" IsAutoGenerated="True" IsVisible="True" HeaderText="JobID" />
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="100" FieldName="CustomerID" Name="CustomerID" IsAutoGenerated="True" IsVisible="True" HeaderText="CustomerID" />
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="285" FieldName="StatusID" Name="StatusID" IsAutoGenerated="True" IsVisible="True" HeaderText="StatusID" />
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="100" FieldName="UnitID" Name="UnitID" IsAutoGenerated="True" IsVisible="True" HeaderText="UnitID" />
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="100" FieldName="OperatorID" Name="OperatorID" IsAutoGenerated="True" IsVisible="True" HeaderText="OperatorID" />
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="100" FieldName="JobTypeID" Name="JobTypeID" IsAutoGenerated="True" IsVisible="True" HeaderText="JobTypeID" />
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="100" FieldName="JobCatID" Name="JobCatID" IsAutoGenerated="True" IsVisible="True" HeaderText="JobCatID" />
<Telerik.WinControls.UI.GridViewDateTimeColumn Width="100" FieldName="StartTime" Name="StartTime" IsAutoGenerated="True" IsVisible="True" HeaderText="StartTime">
<FilterDescriptor xsi:type="Telerik.WinControls.Data.DateFilterDescriptor" Value="" IgnoreTimePart="False" PropertyName="StartTime" Operator="IsNotNull" IsFilterEditor="True" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</Telerik.WinControls.UI.GridViewDateTimeColumn>
<Telerik.WinControls.UI.GridViewDateTimeColumn Width="100" FieldName="FinishTime" Name="FinishTime" IsAutoGenerated="True" IsVisible="True" HeaderText="FinishTime" />
<Telerik.WinControls.UI.GridViewDateTimeColumn Width="100" FieldName="CreateDate" Name="CreateDate" SortOrder="Descending" IsAutoGenerated="True" IsVisible="True" HeaderText="CreateDate" />
<Telerik.WinControls.UI.GridViewDateTimeColumn Width="100" FieldName="StatusJobDate" Name="StatusJobDate" IsAutoGenerated="True" IsVisible="True" HeaderText="StatusJobDate" />
<Telerik.WinControls.UI.GridViewTextBoxColumn Width="100" FieldName="UserID" Name="UserID" IsAutoGenerated="True" IsVisible="True" HeaderText="UserID" />
<Telerik.WinControls.UI.GridViewTextBoxColumn DataType="System.Guid" Width="100" FieldName="TableKey" Name="TableKey" IsAutoGenerated="True" IsVisible="False" HeaderText="TableKey" />
</Columns>
<FilterDescriptors>
<Telerik.WinControls.Data.DateFilterDescriptor Value="" IgnoreTimePart="False" PropertyName="StartTime" Operator="IsNotNull" IsFilterEditor="True" />
</FilterDescriptors>
<SortDescriptors>
<Telerik.WinControls.Data.SortDescriptor PropertyName="CreateDate" Direction="Descending" />
</SortDescriptors>
<ViewDefinition xsi:type="Telerik.WinControls.UI.TableViewDefinition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</MasterTemplate>
</RadGridView>
Workaround:
public class CustomGridView : RadGridView
{
protected override GridViewLayoutSerializer CreateGridViewLayoutSerializer(Telerik.WinControls.XmlSerialization.ComponentXmlSerializationInfo info)
{
return new CustomGridViewLayoutSerializer(info);
}
public override string ThemeClassName
{
get
{
return typeof(RadGridView).FullName;
}
}
}
public class CustomGridViewLayoutSerializer : GridViewLayoutSerializer
{
public CustomGridViewLayoutSerializer(ComponentXmlSerializationInfo componentSerializationInfo) : base(componentSerializationInfo)
{
}
protected override bool ProcessReaderAttribute(System.Xml.XmlReader reader, object parentObject, object toRead, PropertyDescriptor property)
{
if (toRead is FilterDescriptor && reader.Value == string.Empty)
{
object val = reader.Value;
if (property.ComponentType == typeof(DateFilterDescriptor))
{
val = null;
}
this.SetPropertyValue(property, toRead, val);
return true;
}
return base.ProcessReaderAttribute(reader, parentObject, toRead, property);
}
}
When we have column groups with equal names, the Spread Export is not exporting the groups correctly. This will lead to incorrectly merged cells.
A possible workaround is to assure that all column groups have different strings for their Text property.
Please run the sample project and follow the steps:
1.Open the attached solution in Visual Studio - I am using VS 2022.To reproduce, rebind the grid to a data table on button click and show grid's search row.
public RadForm1()
{
InitializeComponent();
this.radGridView1.AllowSearchRow = true;
}
private void RadButton1_Click()
{
DataTable dt = this.GetData();
this.radGridView1.DataSource = dt;
}
private DataTable GetData()
{
DataTable data = new DataTable();
for (int i = 0; i < 5; i++)
{
data.Columns.Add("Column " + i, typeof(int));
data.Columns.Add("Column " + i + 1, typeof(string));
data.Columns.Add("Column " + i + 2, typeof(string));
}
for (int k = 0; k < 5000; k++)
{
object[] parameters = new object[15];
for (int i = 0; i < 15; i += 3)
{
parameters[i] = k;
parameters[i + 1] = "Text " + i;
parameters[i + 2] = "Text " + i + 1;
}
data.Rows.Add(parameters);
}
return data;
}
Please use the attached sample project.
Hi There,
This call is only a nice to have, it is not critical at all. It is just a slight annoyance when building the Grid's columns - especially when there are many columns to adjust. My workflow is usually as follow.
Add all the columns needed, then after that I will run through all the columns and want to set the widths. But my speed is broken because I can't tab between the 3 width properties: Width, Min Width, Max Width. I have to click to put focus the the next value.
If possible, please can you correct the tab indexes?
Thank you
Kind Regards
Ben
PS. You may close this ticket immediately - this is only a request.
Use the following code snippet:
ThemeResolutionService.ApplicationThemeName = "MaterialPink";
radGridView1.ElementTree.EnableApplicationThemeName = false;
radGridView1.ThemeName = "FluentDark";
Workaround:
private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
{
RadDropDownListEditor ddlEditor = e.ActiveEditor as RadDropDownListEditor;
if (ddlEditor != null)
{
RadDropDownListEditorElement el = ddlEditor.EditorElement as RadDropDownListEditorElement;
el.Popup.ElementTree.EnableApplicationThemeName = false;
el.Popup.ThemeName = this.radGridView1.ThemeName;
}
}
Please refer to the attached sample project and follow the steps from the grid file:
Steps to reproduce:
1. Filter the checkbox column to only show unchecked rows
2. Enter "5" for filtering the Name column
3. Click the checkbox column on the bottom row
4. Remove filter value in the Name column
This will result in the unrelated record showing as checked. Scrolling or changing sorting may refresh the cell. If the filter is cleared by using the No filter menu option, the problem is not observed