Completed
Last Updated: 04 Jun 2020 14:59 by ADMIN
Release R2 2020 SP1
Created by: Ketan
Comments: 2
Category: GridView
Type: Bug Report
0

Hi,

Please check the attached sample project.

I think CompositeFilter does not respect CaseSensitive property.

Thanks

Completed
Last Updated: 03 Jun 2020 16:31 by ADMIN
Release R2 2020 SP1 (LIB 2020_2_603)

When RadGridView is bound to a collection of 60 000 records the difference in the sorting time between using a ProBindingSource and a DataTable is massive. Changes in any core logic in both internal implementations, RadGridView and ProBindingSource, isn't so easy as it looks. Both products have been for a very long time on the market designed to cover the main scenarios of the target customers groups for which they are developed.

By default, if the rows count is less than 10 000 we use quick sort to order the items in the grid. If there are more items we use Red-Black tree. This is controlled by the UseHybridIndex property.  

(radGridView.MasterTemplate.ListSource.CollectionView as GridDataView).UseHybridIndex = false;

However, both of algorithms use non-linear data access. If the ProBindingSource is not optimized to get data not linearly, the performance wouldn't be satisfactory. 

That is why we have introduced the BypassSort functionality to cover this case after cooperation with the OE developers. Thus, our RadGridView won't perform any logic for sorting and the whole time necessary for sorting will depend on the DataSource itself (ProBindingSource in your case) and how this collection sorts its items: https://docs.telerik.com/devtools/winforms/controls/gridview/sorting/basic-sorting 

In the current version of Telerik UI for WinForms suite, the BypassSort property is ignored if the BypassFilter is not set to true as well. Hence, the sorting will be still slow.

Both properties shouldn't affect each other and if a developer wants to improve only the sorting performance, it is expected to enable only the ByPassSort property.

 

Completed
Last Updated: 06 Apr 2020 16:57 by ADMIN
Release R2 2020 (LIB 2020.1.413)
Completed
Last Updated: 06 Apr 2020 16:56 by ADMIN
Release R2 2020 (LIB 2020.1.413)

Please refer to the attached sample project and follow the steps illustrated in the gif file. 

The issue is also reproducible in the Demo application.

Workaround: in the RadDataFilter.Edited event you can use the Expression to filter the grid:

 Me.RadGridView1.FilterDescriptors.Expression = Me.RadDataFilter1.Expression

Completed
Last Updated: 19 Mar 2020 14:43 by ADMIN
Release R2 2020 (LIB 2020.1.323)

Steps to reproduce:

1. Bind RadGridView to BindingList 

2. Clear the rows collection

3. You can see that SelectedRows.Count =1 although Rows.Count = 0

To workaround:

private void radButton1_Click(object sender, EventArgs e)
        {  
            while (this.pedidos.Count > 0)
            {
                this.pedidos.RemoveAt(0);
            }

            int rows = this.radGridView1.Rows.Count;
            int srows = this.radGridView1.SelectedRows.Count;

        }

Completed
Last Updated: 02 Jan 2020 12:54 by ADMIN
Release R1 2020

Hi,

 

I am working with the RadGridView in my c# winform application. I am using the custom font ("Font Awesome 5 Free Solid") for the RadGridView using the "CellFormatting" event to view the icons along with the text. Here i am able to see the proper icons with text but when i open the filter menu to filter out the rows, i am unable to see the icons (icons shown as the box) as in filterbox we don't have any custom font

I tried to working out the properties of the RadTreeNodeCollection but here we dont have any Custom font property for the same. 

i want to show the text as it is in the filterbox along with the text and the icon.

so can you suggest what i can do to view the icons in the filterbox?

Check the attachment for reference.

 

Completed
Last Updated: 07 Nov 2019 07:03 by ADMIN
ADMIN
Created by: Hristo
Comments: 2
Category: GridView
Type: Bug Report
2
How to reproduce
public partial class Form1 : RadForm
{
    public Form1()
    {
        InitializeComponent();

        GridViewTextBoxColumn textBoxColumn = new GridViewTextBoxColumn();
        textBoxColumn.Name = "Column";
        textBoxColumn.HeaderText = "Column";
        this.radGridView1.MasterTemplate.Columns.Add(textBoxColumn);

        GridViewTextBoxColumn textBoxColumn2 = new GridViewTextBoxColumn();
        textBoxColumn2.Name = "TextBoxColumn2";
        textBoxColumn2.HeaderText = "ReadOnlyColumn";
        this.radGridView1.MasterTemplate.Columns.Add(textBoxColumn2);

        for (int i = 0; i < 10; i++)
        {
            object v = i * 2;
            if (i % 3 == 0)
            {
                v = null;
            }

            this.radGridView1.Rows.Add(new object[] { i, v });
        }

        this.radGridView1.MultiSelect = true;
        foreach (var row in this.radGridView1.Rows)
        {
            foreach (var cell in row.Cells)
            {
                GridViewCellInfo cellInfo = cell as GridViewCellInfo;
                if (cellInfo != null && cellInfo.RowInfo.Index % 3 == 0 && cellInfo.ColumnInfo.Index == 1)
                {
                    cellInfo.ReadOnly = true;
                }
            }
        }
    }

}

Workaround:
public class MyRadGridView : RadGridView
{
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadGridView).FullName;
        }
    }

    protected override RadGridViewElement CreateGridViewElement()
    {
        return new MyRadGridViewElement();
    }
}

internal class MyRadGridViewElement : RadGridViewElement
{
    protected override Type ThemeEffectiveType
    {
        get
        {
            return typeof(RadGridViewElement);
        }
    }

    protected override MasterGridViewTemplate CreateTemplate()
    {
        return new MyMasterGridViewTemplate();
    }
}

internal class MyMasterGridViewTemplate : MasterGridViewTemplate
{
    protected override void PasteDataToRow(List<string> rowData, GridViewRowInfo row)
    {
        {
            int colIndex = this.Owner.CurrentColumn.Index;
            int j = 0;

            while (j < rowData.Count && colIndex < this.CurrentView.ViewTemplate.ColumnCount)
            {
                GridViewColumn col = this.CurrentView.ViewTemplate.Columns[colIndex];
                if (col.IsVisible && !col.ReadOnly && !row.Cells[colIndex].ReadOnly)
                {

                    object value = rowData[j];

                    if (string.IsNullOrEmpty(rowData[j]))
                    {
                        value = null;
                    }
                    else if (this.CurrentView.ViewTemplate.Columns[colIndex].DataType == typeof(string))
                    {
                        GridViewTextBoxColumn textColumn = col as GridViewTextBoxColumn;

                        if (textColumn != null && textColumn.MaxLength > 0)
                        {
                            if (rowData[j].Length > textColumn.MaxLength)
                            {
                                value = rowData[j].Substring(0, textColumn.MaxLength);
                            }
                        }
                    }
                    else if (this.CurrentView.ViewTemplate.Columns[colIndex].DataType == typeof(DateTime))
                    {
                        try
                        {
                            value = DateTime.Parse(rowData[j], this.CurrentView.ViewTemplate.Columns[colIndex].FormatInfo);
                        }
                        catch { }
                    }
                    else if (this.CurrentView.ViewTemplate.Columns[colIndex].DataType == typeof(Color))
                    {
                        try
                        {
                            value = ColorTranslator.FromHtml(rowData[j]);
                        }
                        catch { }
                    }

                    if (this.ClipboardPasteMode == GridViewClipboardPasteMode.EnableWithNotifications)
                    {
                        CellValidatingEventArgs cellValidating = new CellValidatingEventArgs(row, col, value, row.Cells[colIndex].Value, null);
                        this.EventDispatcher.RaiseEvent<CellValidatingEventArgs>(EventDispatcher.CellValidating, this, cellValidating);

                        if (!cellValidating.Cancel)
                        {
                            row.Cells[colIndex].Value = value;

                            CellValidatedEventArgs cellValidated = new CellValidatedEventArgs(row, col, value);
                            this.EventDispatcher.RaiseEvent<CellValidatedEventArgs>(EventDispatcher.CellValidated, this, cellValidated);
                        }
                    }
                    else
                    {
                        row.Cells[colIndex].Value = value;
                    }

                    j++;
                }

                colIndex++;
            }
        }
    }
}


Completed
Last Updated: 17 Oct 2019 09:43 by ADMIN
RadGridView can not change the current column (by using the IsCurrent of the desired column) in the CurrentColumnChanged event.
Completed
Last Updated: 14 Oct 2019 10:43 by ADMIN
Release R3 2019 SP1
Add a combo-box column that point to a field with Guid data type, add summary item to this columns as well.

Workaround: 

private void RadGridView1_CreateRowInfo(object sender, GridViewCreateRowInfoEventArgs e)
{
    if (e.RowInfo is GridViewSearchRowInfo)
    {
        e.RowInfo = new MySerachRow(e.ViewInfo);
    }

}
class MySerachRow : GridViewSearchRowInfo
{
    public MySerachRow(GridViewInfo viewInfo) : base(viewInfo)
    {
    }

    public override string GetCellFormattedValue(GridViewRowInfo row, GridViewColumn column)
    {
        if (row is GridViewSummaryRowInfo)
        {
            return "";
        }
        return base.GetCellFormattedValue(row, column);
    }
}
 
Completed
Last Updated: 14 Oct 2019 10:33 by ADMIN
Release R3 2019 SP1

Dear Telerik Support Team,

 

I have a Grid with one level of Hierarchy, I am using also the search row control of Gridview but this control only searches the data in the Parent Grid and not in the child Grid, I am using the version: v.2019.2.618.20 of Telerik controls in the Project. Below is the code snippet which is used in the Project, please let us know how we can search in child grid using the search row of the Gridview.

 

            radgvStockCount.DataSource = dtStockCountHeader
            radgvStockCount.MasterTemplate.EnableHierarchyFiltering = True
            radgvStockCount.UseScrollbarsInHierarchy = True
            radgvStockCount.MasterTemplate.Columns("INVCountHeaderId").IsVisible = False
            radgvStockCount.MasterTemplate.Columns("INVCountNo").HeaderText = "Stock Count No"
            radgvStockCount.MasterTemplate.Columns("CountryCode").HeaderText = "Country Code"
            radgvStockCount.MasterTemplate.Columns("AreaCode").HeaderText = "Area Code"
            radgvStockCount.MasterTemplate.Columns("LocationCode").HeaderText = "Location Code"
            radgvStockCount.MasterTemplate.Columns("LocationName").HeaderText = "Location Name"
            radgvStockCount.MasterTemplate.Columns("CreatedBy").HeaderText = "Opened By"
            radgvStockCount.MasterTemplate.Columns("CreatedDate").HeaderText = "Opened Date"

            Dim template As New GridViewTemplate()
            template.DataSource = dtStockCountBatches
            radgvStockCount.Templates.Add(template)
            template.Columns("INVCountBatchesId").IsVisible = False
            template.Columns("INVCountHeaderId").IsVisible = False
            template.Columns("INVCountNo").HeaderText = "Stock Count No"
            template.Columns("INVCountBatchesNo").HeaderText = "Stock Count Batch No"
            template.Columns("LocationCode").HeaderText = "Location Code"
            template.Columns("LocationName").HeaderText = "Location Name"
            template.Columns("SupervisorQty").HeaderText = "Supervisor Qty"
            template.Columns("CreatedBy").HeaderText = "Batch File Uploaded By"
            template.Columns("CreatedDate").HeaderText = "Uploaded Date"
            template.AllowAddNewRow = False
            template.AllowEditRow = False
            template.AllowDeleteRow = False
            template.AllowSearchRow = False
            template.AllowRowResize = False
            template.EnableFiltering = True
            template.EnableHierarchyFiltering = True
            template.ShowHeaderCellButtons = True
            template.ShowGroupedColumns = True
            template.EnableHierarchyFiltering = True
            template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill

            Dim relation As New GridViewRelation(radgvStockCount.MasterTemplate, template)
            relation.RelationName = "StockCountBatches"
            relation.ParentColumnNames.Add("INVCountHeaderId")
            relation.ChildColumnNames.Add("INVCountHeaderId")
            radgvStockCount.Relations.Add(relation)
Completed
Last Updated: 08 Oct 2019 16:27 by ADMIN
Release R3 2019 SP1

When pressing Enter or Tab in the new row the ParsingDateTime event is fired after the editor is validated. Use attached to reproduce.

 

private void GridView_CellEditorInitialized(object sender, GridViewCellEventArgs e)
{
    var editor = gridView.ActiveEditor as RadDateTimeEditor;
    var editorElement = editor.EditorElement as RadDateTimeEditorElement;
    editorElement.TextBoxElement.MaskType = MaskType.FreeFormDateTime;
    var provider = ((FreeFormDateTimeProvider)editorElement.TextBoxElement.Provider);
    editorElement.TextBoxElement.Provider = new MyFreeFormDateTimeProvider(provider.Mask, provider.Culture, provider.Owner);
}

class MyFreeFormDateTimeProvider : FreeFormDateTimeProvider
{
    public MyFreeFormDateTimeProvider(string mask, CultureInfo culture, RadMaskedEditBoxElement owner) : base(mask, culture, owner)
    {
    }
    public override bool Validate(string stringValue)
    {
        //do your code here
        return base.Validate(stringValue);
    }
}
Completed
Last Updated: 08 Oct 2019 16:26 by ADMIN
Release R3 2019 SP1
Completed
Last Updated: 08 Oct 2019 16:24 by ADMIN
Release R3 2019 SP1
The BackColor is not exported when a custom theme is used along with conditional formatting and BackColor is set to transparent in the custo theme.
Completed
Last Updated: 08 Oct 2019 16:13 by ADMIN
Release R3 2019 SP1
Created by: Dimitar
Comments: 0
Category: GridView
Type: Bug Report
0
The DateTime Value is lost when using a custom format "dd.MM.yyyy" in RadgridView and custom provider is used. 

Workaround: 
Set the MaxDate in the custom provider:
Public Class MyMaskDateTimeProvider
  Inherits MaskDateTimeProvider

  Public Sub New(mask As String, culture As CultureInfo, owner As RadMaskedEditBoxElement)
        MyBase.New(mask, culture, owner)
        Me.MaxDate = DateTime.MaxValue
    End Sub

   
End Class
Completed
Last Updated: 08 Oct 2019 11:19 by ADMIN
Release R3 2019 SP1
Created by: Syed Hussain
Comments: 5
Category: GridView
Type: Bug Report
0

We have upgraded from WinControl UI 2010 to 2019 R2. 

we have a lot of non-data bound radgridview that we process our data and add each row manually.

The radgridView.Rows.Add(rowdatacolumn1, rowdatacolumn2, rowdatacolumn3) used to return the row index of the added row. It is now returning -1 . 

This is breaking a lot of our code. 

Completed
Last Updated: 22 Aug 2019 13:22 by ADMIN
To reproduce: run the attached project and toggle the checkbox in the header cell of the child template. 

Workaround: use a custom GridCheckBoxHeaderCellElement


    public partial class RadForm1 : Telerik.WinControls.UI.RadForm
    {
        public RadForm1()
        {
            InitializeComponent();

            this.radGridView1.CreateCell += radGridView1_CreateCell;

            DataTable dt = new DataTable();
            dt.Columns.Add("CategoryId", typeof(int));
            dt.Columns.Add("CategoryName", typeof(string));
            dt.Columns.Add("ParentCategoryId", typeof(int));

            dt.Rows.Add(1, "Category1", 0);
            dt.Rows.Add(2, "Category2", 0);
            dt.Rows.Add(3, "Category3", 0);

            Random rand = new Random();
            for (int i = 4; i < 20; i++)
            {
                dt.Rows.Add(i, "Category" + i, rand.Next(1, 4));
            }
            this.radGridView1.Relations.AddSelfReference(this.radGridView1.MasterTemplate, "CategoryId", "ParentCategoryId");
            this.radGridView1.DataSource = dt;
            this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;

            GridViewTemplate childTemplate = CreateChildTemplate();
            GridViewRelation relation = new GridViewRelation(
                this.radGridView1.MasterTemplate,
                childTemplate);
            relation.ChildColumnNames.Add("CategoryId");
            relation.ParentColumnNames.Add("CategoryId");
            this.radGridView1.Relations.Add(relation);
        }

        private void radGridView1_CreateCell(object sender, GridViewCreateCellEventArgs e)
        {
            if (e.CellType == typeof(GridCheckBoxHeaderCellElement))
            {
                e.CellElement = new CustomGridCheckBoxHeaderCellElement(e.Column, e.Row);
            }
        }

        private GridViewTemplate CreateChildTemplate()
        {
            GridViewTemplate childTemplate = new GridViewTemplate();
            childTemplate.AutoGenerateColumns = false;
            this.radGridView1.Templates.Add(childTemplate);

            GridViewDecimalColumn decColumn = new GridViewDecimalColumn
            {
                Name = "CategoryId",
                HeaderText = "CategoryId Id",
                FieldName = "CategoryId",
                IsVisible = false,
                MinWidth = 100
            };
            childTemplate.Columns.Add(decColumn);

            GridViewTextBoxColumn tbxColumn = new GridViewTextBoxColumn
            {
                Name = "RightName",
                HeaderText = "Right Name",
                FieldName = "RGT_NAME",
                ReadOnly = true,
                MinWidth = 100
            };
            childTemplate.Columns.Add(tbxColumn);

            GridViewCheckBoxColumn chkxColumn = new GridViewCheckBoxColumn
            {
                Name = "Checkbox",
                EnableHeaderCheckBox = true,
                FieldName = "HasAccess",
            };
            childTemplate.Columns.Add(chkxColumn);
            childTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
            return childTemplate;
        }

        public class CustomGridCheckBoxHeaderCellElement : GridCheckBoxHeaderCellElement
        {
            public CustomGridCheckBoxHeaderCellElement(GridViewColumn column, GridRowElement row) : base(column, row)
            {
            }

            public bool SuspendProcessingToggleStateChanged
            {
                get
                {
                    FieldInfo fi = typeof(GridCheckBoxHeaderCellElement).GetField("suspendProcessingToggleStateChanged", BindingFlags.NonPublic | BindingFlags.Instance);
                    return (bool)fi.GetValue(this);
                }
                set
                {
                    FieldInfo fi = typeof(GridCheckBoxHeaderCellElement).GetField("suspendProcessingToggleStateChanged", BindingFlags.NonPublic | BindingFlags.Instance);
                    fi.SetValue(this, value);
                }
            }

            public bool ShouldCheckDataRows
            {
                get
                {
                    FieldInfo fi = typeof(GridCheckBoxHeaderCellElement).GetField("shouldCheckDataRows", BindingFlags.NonPublic | BindingFlags.Instance);
                    return (bool)fi.GetValue(this);
                }
                set
                {
                    FieldInfo fi = typeof(GridCheckBoxHeaderCellElement).GetField("shouldCheckDataRows", BindingFlags.NonPublic | BindingFlags.Instance);
                    fi.SetValue(this, value);
                }
            }

            protected override void checkbox_ToggleStateChanged(object sender, StateChangedEventArgs args)
            {
                if (SuspendProcessingToggleStateChanged)
                {
                    return;
                }

                if (this.ViewTemplate != null && !this.ViewTemplate.IsSelfReference && !this.MasterTemplate.IsSelfReference)
                {
                    this.MasterTemplate.BeginUpdate();
                }
                else
                {
                    this.TableElement.BeginUpdate();
                }

                object valueState = DBNull.Value;

                if (args.ToggleState == ToggleState.On)
                {
                    valueState = true;
                }
                else if (args.ToggleState == ToggleState.Off)
                {
                    valueState = false;
                }
                else if (args.ToggleState == ToggleState.Indeterminate)
                {
                    valueState = null;
                }

                RaiseToggleStateEvent();

                if (!ShouldCheckDataRows)
                {
                    if (this.ViewTemplate != null && !this.ViewTemplate.IsSelfReference && !this.MasterTemplate.IsSelfReference)
                    {
                        this.MasterTemplate.EndUpdate(true, new DataViewChangedEventArgs(ViewChangedAction.DataChanged));
                    }

                    return;
                }

                this.GridViewElement.EditorManager.EndEdit();

                this.TableElement.BeginUpdate();
                this.MasterTemplate.MasterViewInfo.TableSearchRow.SuspendSearch();
                List<GridViewRowInfo> list = GetRowsToIterateOver();
                foreach (GridViewRowInfo rowInfo in list)
                {
                    GridViewGroupRowInfo groupRow = rowInfo as GridViewGroupRowInfo;

                    if (groupRow != null)
                    {
                        this.CheckAllCheckBoxInChildRows(groupRow, valueState);
                    }
                    else
                    {
                        rowInfo.Cells[this.ColumnIndex].Value = valueState;
                    }
                }
                this.MasterTemplate.MasterViewInfo.TableSearchRow.ResumeSearch();
                this.TableElement.EndUpdate(false);

                if (this.ViewTemplate != null && !this.ViewTemplate.IsSelfReference && !this.MasterTemplate.IsSelfReference)
                {
                    this.MasterTemplate.EndUpdate(true, new DataViewChangedEventArgs(ViewChangedAction.DataChanged));
                }
                else
                {
                    this.TableElement.EndUpdate(false);
                }

                this.TableElement.Update(GridUINotifyAction.DataChanged);
            }

            private void CheckAllCheckBoxInChildRows(GridViewGroupRowInfo row, object state)
            {
                List<GridViewRowInfo> list = new List<GridViewRowInfo>();

                foreach (GridViewRowInfo rowInfo in row.ChildRows)
                {
                    list.Add(rowInfo);
                }

                foreach (GridViewRowInfo rowInfo in list)
                {
                    GridViewGroupRowInfo groupInfo = rowInfo as GridViewGroupRowInfo;
                    if (groupInfo != null)
                    {
                        this.CheckAllCheckBoxInChildRows(groupInfo, state);
                    }
                    else
                    {
                        rowInfo.Cells[this.ColumnIndex].Value = state;
                    }
                }
            }

            private List<GridViewRowInfo> GetRowsToIterateOver()
            {
                if (this.ViewTemplate != null && this.ViewTemplate.IsSelfReference)
                {
                    PrintGridTraverser traverser = new PrintGridTraverser(this.ViewInfo);
                    List<GridViewRowInfo> result = new List<GridViewRowInfo>();

                    while (traverser.MoveNext())
                    {
                        if (traverser.Current is GridViewDataRowInfo)
                        {
                            result.Add(traverser.Current);
                        }
                    }

                    return result;
                }

                return new List<GridViewRowInfo>(this.ViewInfo.Rows);
            }
        }
    }
Completed
Last Updated: 17 Jul 2019 07:33 by ADMIN
Release R3 2019 (LIB 2019.2.722)
Completed
Last Updated: 15 Jul 2019 08:33 by ADMIN
Release R3 2019 (LIB 2019.2.722)
Created by: Daniel
Comments: 1
Category: GridView
Type: Bug Report
6

Steps to reproduce:

  1. Click column header to sort.
  2. Click button which to export to Excel.
  3. The rows return to unsorted.
  4. Scroll down slightly and scroll back up and the sort is restored.

This happens after calling RunExport.

I attached a gif and a sample project.

Completed
Last Updated: 01 Jul 2019 15:04 by ADMIN
Release R3 2019 (LIB 2019.2.708)

UI for WinForms R2 2019 SP1 (version 2019.2.618)

June 19, 2019

RadGridView

NEW
  • New property inside GridViewSearchRowInfo: DeferredSearch. Gets or sets a value indicating whether grid will wait until enter key is pressed before it starts a search.

 

 

I have implemented this and it is exactly what I want and need, Thank you! 
However I thought I might point out that when you tab out it doesn't implement the search, only when you press enter.

And when you press the X to clear the search it clears the text box but not the search. the count of found and the highlighted finds remain 

Completed
Last Updated: 28 Jun 2019 08:50 by ADMIN
Release R2 2019 SP1
Created by: Sasa
Comments: 2
Category: GridView
Type: Bug Report
1
RadGridView data source contains date values from years 2018 and 2019. After adding Excel like filters to the RadGridView and selecting year 2019 no rows were displayed, even though some values did match the filter condition (see attachment).
1 2 3 4 5 6