Unplanned
Last Updated: 20 Oct 2017 08:44 by ADMIN
Completed
Last Updated: 12 Oct 2017 12:18 by ADMIN
How to reproduce:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.radGridView1.DataSource = this.GetData();
        this.radGridView1.EditorRequired += RadGridView1_EditorRequired;
    }

    private void RadGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
    {
        if (this.radGridView1.CurrentColumn.Index == 0)
        {
            e.Editor = new RadTimePickerElement();
        }
    }

    private DataTable GetData()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Date", typeof(DateTime));

        for (int i = 0; i < 20; i++)
        {
            DataRow r = dt.NewRow();
            dt.Rows.Add(r);
        }
        
        return dt;
    }
}

Workaround: the scenario is not completely valid as when handling the EditorRequiredEvent one should use the GridTimePickerEditor
1. Use the column`s EditorType property: 
((GridViewDateTimeColumn)this.radGridView1.Columns["Date"]).EditorType = GridViewDateTimeEditorType.TimePicker
2. Alternatively, handle the event this way:
private void RadGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
{
    if (this.radGridView1.CurrentColumn.Index == 0)
    {
        e.Editor = new GridTimePickerEditor();
    }
}
Completed
Last Updated: 11 Oct 2017 12:10 by ADMIN
To reproduce: run the attached sample project and click the new row.

Workaround: don't call the Begin/EndUpdate methods in the CurrentRowChanged event.
Completed
Last Updated: 10 Oct 2017 12:22 by ADMIN
How to reproduce: check the attached project

Workaround: create a custom RadListFilterPopup
public class MyRadListFilterPopup : RadListFilterPopup
    {
        public MyRadListFilterPopup(GridViewDataColumn dataColumn, bool groupedDateValues)
            : base(dataColumn, groupedDateValues)
        { }

        protected override void OnButtonOkClick(EventArgs e)
        {
            FilterOperator filterOperator = FilterOperator.IsEqualTo;

            IRadListFilterElement listFilterElement = (IRadListFilterElement)typeof(RadListFilterPopup).GetField("listFilterElement", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this);
            RadListFilterDistinctValuesTable selectedValues = listFilterElement.SelectedValues;

            switch (listFilterElement.SelectedMode)
            {
                case ListFilterSelectedMode.All:
                    filterOperator = FilterOperator.None;
                    break;
                case ListFilterSelectedMode.Null:
                    filterOperator = FilterOperator.IsNull;
                    break;
                case ListFilterSelectedMode.NotNull:
                    filterOperator = FilterOperator.IsNotNull;
                    break;
            }

            if (filterOperator != FilterOperator.IsEqualTo)
            {
                SetFilterOperator(filterOperator);
                this.ClosePopup(RadPopupCloseReason.CloseCalled);
            }
            else
            {
                CompositeFilterDescriptor compositeFilterDescriptor = new CompositeFilterDescriptor();
                compositeFilterDescriptor.PropertyName = this.DataColumn.Name;
                RadListFilterDistinctValuesTable distinctValues = this.GetDistinctValuesTable();
                string blanksKey = RadGridLocalizationProvider.CurrentProvider.GetLocalizedString(RadGridStringId.FilterMenuBlanks);
                bool blanks = selectedValues.Contains(blanksKey);
                if (selectedValues.Count > distinctValues.Count / 2 && !blanks)
                {
                    compositeFilterDescriptor.LogicalOperator = FilterLogicalOperator.And;

                    foreach (DictionaryEntry entry in distinctValues)
                    {
                        string key = (string)entry.Key;
                        if (string.IsNullOrEmpty(key))
                        {
                            key = blanksKey;
                        }

                        if (!selectedValues.Contains(key))
                        {
                            foreach (object value in (ArrayList)entry.Value)
                            {
                                FilterDescriptor descriptor;
                                if (value == DBNull.Value)
                                {
                                    descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, null);
                                }
                                else if (this.DataColumn is GridViewDateTimeColumn || this.DataColumn.DataType == typeof(DateTime) || this.DataColumn.DataType == typeof(DateTime?))
                                {
                                    descriptor = new DateFilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, (DateTime?)value, false);
                                }
                                else
                                {
                                    descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, value);
                                }

                                compositeFilterDescriptor.FilterDescriptors.Add(descriptor);
                            }
                        }
                    }
                }
                else
                {
                    compositeFilterDescriptor.LogicalOperator = FilterLogicalOperator.Or;

                    foreach (DictionaryEntry entry in selectedValues)
                    {
                        foreach (object value in (ArrayList)entry.Value)
                        {
                            FilterDescriptor descriptor;
                            if (value == DBNull.Value)
                            {
                                descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, null);
                            }
                            else if (this.DataColumn is GridViewDateTimeColumn || this.DataColumn.DataType == typeof(DateTime) || this.DataColumn.DataType == typeof(DateTime?))
                            {
                                descriptor = new DateFilterDescriptor(this.DataColumn.Name, FilterOperator.IsEqualTo, (DateTime?)value, false);
                            }
                            else
                            {
                                descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsEqualTo, value);
                            }

                            compositeFilterDescriptor.FilterDescriptors.Add(descriptor);
                        }
                    }
                }

                this.FilterDescriptor = compositeFilterDescriptor;
                OnFilterConfirmed();
            }
        }
    }
Completed
Last Updated: 11 Sep 2017 10:27 by ADMIN
To reproduce: bind the grid to a DataTable where one of the columns doesn't allow null values. Try to add a new record by using the new row in the grid. Even though you specify default values in the DefaultValuesNeeded event, the error still occurs. Please refer to the attached sample project and gif file.

Workaround: handle the RadGridView.DataError event:

private void RadGridView1_DataError(object sender, Telerik.WinControls.UI.GridViewDataErrorEventArgs e)
{
    if (e.Exception.ToString().Contains("does not allow nulls"))
    {
        e.Cancel = true;
    }
}
Completed
Last Updated: 05 Sep 2017 09:42 by ADMIN
Currently, DisplayFormatType.GeneralDate, DisplayFormatType.ShortDate, DisplayFormatType.MediumDate all return culture's DateTimeFormat.ShortDatePattern. 

Workaround: 
GridViewDateTimeColumn columnDateTime = this.radGridView1.Columns["Date"] as GridViewDateTimeColumn;
columnDateTime.ExcelExportType = DisplayFormatType.Custom; 
columnDateTime.ExcelExportFormatString  = "dd/MM/yyyy hh:mm:ss";
Completed
Last Updated: 05 Sep 2017 08:04 by ADMIN
How to reproduce check the attached project: 

Workaround: Create a custom spread export renderer

public class MySpreadExportRenderer : SpreadExportRenderer
{
    public override void AddWorksheet(string sheetName)
    {
        string name = "";

        Workbook wb = (Workbook)typeof(SpreadExportRenderer).GetField("workbook", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this);
        if (sheetName == null || sheetName == string.Empty)
        {
            name = "Sheet_" + (wb.Worksheets.Count + 1);
        }
        else
        {
            name = sheetName;
        }

        if (wb.Worksheets.Where(w => w.Name == name).ToList().Count == 0)
        {
            base.AddWorksheet(sheetName);
        }
        else
        {
            typeof(SpreadExportRenderer).GetField("worksheet", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, wb.Worksheets.Add());
        }
    }
}

Unplanned
Last Updated: 27 Aug 2017 14:34 by mostafa
When I add summary rows to my radgridview. something strange is happening.
I demonstrate it to you in two pictures. please take a look at attachments
Declined
Last Updated: 18 Aug 2017 05:24 by mostafa
Created by: mostafa
Comments: 2
Category: GridView
Type: Feature Request
1
Hi Mostafa,

The end users can copy a single cell even when the SelectionMode is set to FullRowSelect via the ContextMenu when opening it on any of the data cells. If the context menu is opened on the row header they will select the whole row. Please check the attached video: radgridview-context-menu-behavior.gif.

If you would like to copy a single cell using the Ctrl-C command and have the grid setup in FullRowSelect mode please check the attached project featuring a solution. I am also attaching a video showing the result using the custom implementation in the project: radgridview-full-row-ctrl-c.gif
Completed
Last Updated: 15 Aug 2017 11:54 by ADMIN
Use attached to reproduce.

Workaround:

class MyViewDefinition : TableViewDefinition
{
    public override IRowView CreateViewUIElement(GridViewInfo viewInfo)
    {
        return new MyTableElement();
    }
}
class MyTableElement : GridTableElement
{
    public override void DpiScaleChanged(SizeF scaleFactor)
    {
        if (this.ViewTemplate != null)
        {
            base.DpiScaleChanged(scaleFactor);
        }

    }
    protected override Type ThemeEffectiveType
    {
        get { return typeof(GridTableElement); }
    }
}

//use the above definition like this:

 radGridView1.ViewDefinition = new MyViewDefinition();
Completed
Last Updated: 15 Aug 2017 11:03 by ADMIN
To reproduce: run the attached sample project:

1. Clear the value in one of the cells.
2. Select the empty cell and press Ctrl+C to copy the empty cell. You will encounter the error coming from the GetFormattedCellValue method.

Workaround: handle the RadGridView.Copying event

private void RadGridView1_Copying(object sender, GridViewClipboardEventArgs e)
{
    if (this.radGridView1.SelectionMode == GridViewSelectionMode.FullRowSelect)
    {
        foreach (var row in this.radGridView1.SelectedRows)
        {
            foreach (var cell in row.Cells)
            {
                GridViewCellInfo cellInfo = cell as GridViewCellInfo;
                if (cellInfo != null && cellInfo.Value == null)
                {
                    cellInfo.Value = "";
                }
            }
        }
    }
    else
    {
        foreach (var cell in this.radGridView1.SelectedCells)
        {
            if (cell.Value == null)
            {
                cell.Value = "";
            }
        }
    }
}
Completed
Last Updated: 15 Aug 2017 11:03 by ADMIN
How to reproduce:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.radGridView1.DataSource = this.GetData();
            GridViewComboBoxColumn supplierColumn = new GridViewComboBoxColumn();
            supplierColumn.Name = "SupplierColumn";
            supplierColumn.HeaderText = "Supplier";
            supplierColumn.DataSource = this.GetListItemData(); ;
            supplierColumn.ValueMember = "Id";
            supplierColumn.DisplayMember = "Description";
            supplierColumn.Width = 200;
            this.radGridView1.Columns.Add(supplierColumn);
            this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
            this.radGridView1.CellEditorInitialized += RadGridView1_CellEditorInitialized;
        }

        private void RadGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
        {
            RadDropDownListEditor editor = e.ActiveEditor as RadDropDownListEditor;
            if (editor == null)
            {
                return;
            }

            RadDropDownListEditorElement element = (RadDropDownListEditorElement)editor.EditorElement;
            element.ValueChanging -= Element_ValueChanging;
            element.ValueChanging += Element_ValueChanging;
        }

        private void Element_ValueChanging(object sender, ValueChangingEventArgs e)
        {
            Console.WriteLine("ValueChanging");
            Console.WriteLine("Old " + e.OldValue);
            Console.WriteLine("New " + e.NewValue);
        }

        private object GetData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Date", typeof(DateTime));

            for (int i = 0; i < 100; i++)
            {
                dt.Rows.Add(i, "Name " + i, DateTime.Now.AddDays(i));
            }

            return dt;
        }

        public List<Item> GetListItemData()
        {
            List<Item> items = new List<Item>();
            for (int i = 0; i < 10; i++)
            {
                items.Add(new Item(i, "Data" + i, DateTime.Now.AddDays(i).AddHours(i)));
            }

            return items;
        }
    }

    public class Item
    {
        public int Id { get; set; }

        public string Description { get; set; }

        public DateTime Date { get; set; }

        public Item(int id, string description, DateTime date)
        {
            this.Id = id;
            this.Description = description;
            this.Date = date;
        }
    }

Workaround: handle the TextChanging event and store locally the old value
 private void RadGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
 {
     RadDropDownListEditor editor = e.ActiveEditor as RadDropDownListEditor;
     if (editor == null)
     {
         return;
     }

     RadDropDownListEditorElement element = (RadDropDownListEditorElement)editor.EditorElement;

     element.TextChanging-= Element_TextChanging;
     element.TextChanging += Element_TextChanging;
     element.ValueChanging -= Element_ValueChanging;
     element.ValueChanging += Element_ValueChanging;
 }

 object oldValue;
 private void Element_TextChanging(object sender, TextChangingEventArgs e)
 {
     oldValue = e.OldValue;
 }

 private void Element_ValueChanging(object sender, ValueChangingEventArgs e)
 {
     Console.WriteLine("ValueChanging");
     Console.WriteLine("Old " + oldValue);
     Console.WriteLine("New " + e.NewValue);
 }

Completed
Last Updated: 15 Aug 2017 11:03 by Chris
Created by: Matt
Comments: 2
Category: GridView
Type: Feature Request
2
We'd like to see the ability to enable a search/filter function for column chooser.  One of our applications that uses the RadGridView has dozens of columns, most hidden by default.  Our users would like the ability to type in part of a column name and have the column chooser filter on it.
Completed
Last Updated: 15 Aug 2017 11:03 by ADMIN
To reproduce:
1. Filter the first column in the grid
2. Click the header checkbox
3. Try to clear the filter. you iwll notice that the data is still filtered.

Workaround:

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

public class CustomHeaderCell : GridCheckBoxHeaderCellElement
{

    public CustomHeaderCell(GridViewColumn column, GridRowElement row) : base(column, row)
    {
    }

    protected override void checkbox_ToggleStateChanged(object sender, StateChangedEventArgs args)
    {
        base.checkbox_ToggleStateChanged(sender, args);
        this.TableElement.EndUpdate(false);
    }
}

Completed
Last Updated: 15 Aug 2017 11:03 by ADMIN
How to reproduce: Check the attached video --> radgridview-filtering.gif

Workaround:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.radGridView1.DataSource = this.GetData();
        this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;

        this.radGridView1.EnableFiltering = true;
        this.radGridView1.FilterChanging += RadGridView1_FilterChanging;
        this.radGridView1.FilterChanged += RadGridView1_FilterChanged;
    }

    private void RadGridView1_FilterChanged(object sender, GridViewCollectionChangedEventArgs e)
    {
        if (clearFiler)
        {
            this.radGridView1.FilterDescriptors.Remove((FilterDescriptor)e.NewItems[0]);
            clearFiler = false;
        }
    }

    bool clearFiler = false;
    private void RadGridView1_FilterChanging(object sender, GridViewCollectionChangingEventArgs e)
    {
        if (e.PropertyName == "Operator" && e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.ItemChanging)
        {
            FilterDescriptor fd = e.OldItems[0] as FilterDescriptor;
            if (fd != null && (fd.Operator == FilterOperator.IsNull || fd.Operator == FilterOperator.IsNotNull))
            {
                clearFiler = true;
            }
        }
    }
    private object GetData()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Date", typeof(DateTime));
        dt.Columns.Add("Bool", typeof(bool));

        for (int i = 0; i < 100; i++)
        {
            dt.Rows.Add(i, "Name " + i, DateTime.Now.AddDays(i), i % 2 == 0);
        }

        return dt;
    }
}
Completed
Last Updated: 15 Aug 2017 10:54 by ADMIN
Completed
Last Updated: 15 Aug 2017 10:54 by ADMIN
The CustomSorting event should manipulate the pinned rows as well. Thus, the user will be allowed to control the sort order of the pinned rows within the pinned container.
Completed
Last Updated: 15 Aug 2017 10:54 by ADMIN
Steps to reproduce: 
1. Set DPI scale to 150 of all screens 
2. Run attached sample 
3. The column`s width is not calculated correctly.