Completed
Last Updated: 13 Mar 2024 08:49 by ADMIN
Release 2024.1.312

RadVirtualGrid is created to support a million records or more. Still it contains some "heavy" operations like CopySelection/CutSelection/Paste which can take a long time.

I would like to intercept these methods so I can show a "Please wait"-window during the operation. Furthermore I have the need to set a flag to true when such a operation is executing. 

Completed
Last Updated: 31 Jan 2024 11:39 by ADMIN
Release 2024 Q1 (2024.1.130)
Created by: Youssef
Comments: 0
Category: UI for WinForms
Type: Feature Request
0
Create a Compact Windows 11 theme that can be used in existing applications with non-touch themes. 
Completed
Last Updated: 31 Jan 2024 11:39 by ADMIN
Release 2024 Q1 (2024.1.130)
Created by: Martin
Comments: 13
Category: UI for WinForms
Type: Feature Request
1

We work with a RadGridView with 145000 rows and 4 columns. We use copy-paste to move data around from other apps and the application with build with Telerik.

When we copy a flat file (with tabs delimited fields) and we paste it to the RadGridView, the whole process is painfully slow. The function to retrieve the data from the clipboard takes minutes (maybe hours, I cancelled it). It tracked the cause down to the StringTokenizer class. The tokenizer splits the string up into separate fields. But after extracting a field it creates a new copy of that string (containing about 10MB of data) minus the field. I patched it (with HarmonyX) and now it takes only one second:

static class StringTokenizerPerformancePatch { static private readonly InstanceFieldAccessor<StringTokenizer, LinkedList<string>> _tokens = new InstanceFieldAccessor< StringTokenizer, LinkedList<string>>("tokens"); static private readonly InstanceFieldAccessor<StringTokenizer, string> _sourceString = new InstanceFieldAccessor<StringTokenizer, string>("sourceString"); static private readonly InstanceFieldAccessor< StringTokenizer, string> _delimiter = new InstanceFieldAccessor<StringTokenizer, string>("delimiter"); static private readonly InstanceFieldAccessor< StringTokenizer, IEnumerator<string>> _enumerator = new InstanceFieldAccessor<StringTokenizer, IEnumerator<string>>("enumerator"); [HarmonyPatch(typeof(StringTokenizer), "Tokenize")] staticclassPatch_StringTokenizer_Tokenize { static bool Prefix(StringTokenizer __instance) { var tokens = _tokens.GetValue(__instance); var sourceString = _sourceString.GetValue(__instance); var delimiter = _delimiter.GetValue(__instance); Tokenize(tokens, sourceString, delimiter); _enumerator.SetValue(__instance, tokens.GetEnumerator()); returnfalse; } static private void Tokenize(LinkedList<string> tokens, string text, string delimiter) { tokens.Clear(); if (string.IsNullOrEmpty(text)) return; int index = 0; while(true) { var index2 = text.IndexOf(delimiter, index, StringComparison.Ordinal); if (index2 < 0) { tokens.AddLast(text.Substring(index)); break; } string token = text.Substring(index, index2 - index); tokens.AddLast(token); index = index2 + delimiter.Length; } } } }

Please update your tokanizer to increase performance. While you are at it:
  • If delimiters are one character, why not use String.Split?
  • Why use a LinkedList?
Completed
Last Updated: 11 Oct 2023 10:09 by ADMIN
Release R3 2023
Created by: Stoyan
Comments: 4
Category: UI for WinForms
Type: Feature Request
4
A control that can be used to display an icon in the Windows taskbar notification area.
Completed
Last Updated: 07 Jun 2023 10:38 by ADMIN
Release R2 2023 (2023.2.606)

Our clients can download different product files from their Telerik account:

https://docs.telerik.com/devtools/winforms/installation-and-upgrades/download-product-files 

Currently, when Digitally Signed Assemblies are necessary, they submit support tickets and the support engineers provide the signed assemblies. It would be nice to be directly uploaded to the Telerik account like the rest of the product files.

Completed
Last Updated: 05 Apr 2023 10:02 by ADMIN
Release R1 2023 SP1

This is about this method:

        public void SetError(GridViewCellCancelEventArgs e, Exception exception)
        {
            GridViewDataErrorEventArgs args = new GridViewDataErrorEventArgs(exception, 0, 0, GridViewDataErrorContexts.Commit);
            if (e != null)
            {
                args = new GridViewDataErrorEventArgs(exception, e.ColumnIndex, e.RowIndex, GridViewDataErrorContexts.Commit);
            }
            this.EventDispatcher.RaiseEvent<GridViewDataErrorEventArgs>(EventDispatcher.DataError, this, args);

            if (args.ThrowException)
            {
                throw args.Exception;
            }

            if (args.Cancel)
            {
                //TODO: cancel row edit 
            }
        }

The method GridViewTemplate.SetError accepts a parameter of type GridViewCellCancelEventArgs (named e), but uses the information to create a new object of type GridViewDataErrorEventArgs (named args) and uses information from e to fill args.

The method then fires an event with args. Args also has a property Cancel which can be set in the event handlers. But nothing is done with that property.

Parameter e also has a property Cancel which is never be filled. So it could be useful, at the end of SetError, to set e.Cancel with args.Cancel. This way the caller can use the Cancel information from the events.

This request is also related to my next request. 

PS: Why is GridViewCellCancelEventArgs  called this way? It implies it has arguments for an event, but it is not used for an event, am I right?

Completed
Last Updated: 24 Feb 2023 10:20 by ADMIN
Release R1 2023

The assembly is required for our RadMarkupEditor using the IE rendering engine. It allows you to specify HTML-like text formatting at design time in the Properties window of Visual studio:

 

Completed
Last Updated: 02 Feb 2023 09:38 by ADMIN
Release R1 2023
Completed
Last Updated: 01 Nov 2022 13:52 by ADMIN
Release R3 2022 SP2
Created by: Desislava
Comments: 0
Category: UI for WinForms
Type: Feature Request
0

The ChartLegendElement displays the legend items in a StackLayoutElement which can be either vertical or horizontal.

        public RadForm1()
        {
            InitializeComponent();

            Random rand = new Random();
            List<LineSeries> list = new List<LineSeries>();
            for (var index = 1; index <= 15; index++)
            {
                LineSeries ls = new LineSeries();
                ls.LegendTitle = "Series " + index;
                list.Add(ls);
            }

            for (int index = 1; index <= 100; index++)
            {
                foreach (LineSeries s in list)
                    s.DataPoints.Add(new CategoricalDataPoint(index, rand.Next(0, rand.Next(5, 20))));
            }
            this.radChartView1.Series.AddRange(list.ToArray());
            this.radChartView1.ShowLegend = true;
            this.radChartView1.ChartElement.LegendPosition = LegendPosition.Bottom;
            this.radChartView1.ChartElement.LegendElement.StackElement.Orientation = Orientation.Vertical;
        }

Horizontal:

Vertical:

It would be good to provide an option for wrapping the legend items:

chartview-wrap-legend-items002

Workaround: use an appropriate container for the legend items to wrap the legend item and use the space more efficiently

https://docs.telerik.com/devtools/winforms/knowledge-base/chartview-wrap-legend-items 

 

Completed
Last Updated: 01 Nov 2022 13:06 by ADMIN
Release R3 2022 SP2
Created by: Martin
Comments: 1
Category: UI for WinForms
Type: Feature Request
0

This is about the following method:

        public void SetError(GridViewCellCancelEventArgs e, Exception exception)
        {
            GridViewDataErrorEventArgs args = new GridViewDataErrorEventArgs(exception, 0, 0, GridViewDataErrorContexts.Commit);
            if (e != null)
            {
                args = new GridViewDataErrorEventArgs(exception, e.ColumnIndex, e.RowIndex, GridViewDataErrorContexts.Commit);
            }
            this.EventDispatcher.RaiseEvent<GridViewDataErrorEventArgs>(EventDispatcher.DataError, this, args);

            if (args.ThrowException)
            {
                throw args.Exception;
            }

            if (args.Cancel)
            {
                //TODO: cancel row edit 
            }
        }

Right now, the method GridViewTemplate.SetError accepts a parameter of type GridViewCellCancelEventArgs, which in itself is weird, because event args should only be used inside events and OnXXX-methods. But since SetError fires an event, one could argue that this method is like a OnXXX-method.

But inside it becomes more weird, it translates GridViewCellCancelEventArgs into GridViewDataErrorEventArgs. And I must admit, the last DataError-args feel a lot more logical that CellCancel-args when firing setting an error. Furthermore, if I create an override of class GridViewCellCancelEventArgs to contain more data about an error, this information never reaches the event handlers.

So why this translation? Or better: Why this parameter?

My suggestion would be to make a new overload:


public void SetError(GridViewDataErrorEventArgs e)
{
    if (e == null)
        throw new ArgumentNullException(nameof(e));

        this.EventDispatcher.RaiseEvent<GridViewDataErrorEventArgs>(EventDispatcher.DataError, this, args);

        if (args.ThrowException)
                throw args.Exception;

        if (args.Cancel)
        {
                // TODO: I really do not know what telerik wanted to do here, so I live this up to Telerik.
        }
}
Furthermore you could consider markering the other SetError-methods as obsolete.
Completed
Last Updated: 23 Sep 2022 13:07 by ADMIN
Release R3 2022
Created by: Dinko
Comments: 0
Category: UI for WinForms
Type: Feature Request
0
You could achieve a similar behavior using a custom form. More information can be found in the Add SplashScreen to your application KB article in our documentation.
Completed
Last Updated: 23 Sep 2022 13:07 by ADMIN
Release R3 2022

I am rewriting the RadGridViewPaste-mechanism. Therefor I want to call PastingCellClipboardContent-event using the EventDispatcher.CellClipboardPaste. therefor I need the class GridViewCellValueEventArgs. It has two constructors:

  1. A constructor with indexes. If this one is used, properties RowInfo and Column will always be null.
  2. A constructor which accepts a row and column as parameters. All properties are set and usable.

The second constructor is marked as Internal, not Public. 

Request: Can this constructor be made Public?

Completed
Last Updated: 29 Apr 2022 13:05 by ADMIN
Release R2 2022
Created by: John
Comments: 1
Category: UI for WinForms
Type: Feature Request
1
Currently it is not possible to select the items added to RadCommandBar, RadRibbonBar or RadMenu.
Completed
Last Updated: 29 Nov 2021 11:16 by ADMIN
Release R1 2022
Created by: Al
Comments: 1
Category: UI for WinForms
Type: Feature Request
1
Request read only property on the RadMultiColumnComboBox control
Completed
Last Updated: 09 Nov 2021 09:01 by ADMIN
Release R3 2021 SP1

The snap layouts window can be opened by using the Win+Z keyboard combination, but when the mouse is over the Maximize button of RadForm, the window is not shown.
MSDN information is available here: https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/apply-snap-layout-menu

Following the guides from MSDN, we need to override the WndProc method of the form, listen to the WM_NCHITTEST message, and return HTMAXBUTTON result when the mouse is over the maximize button.


private const int HTMAXBUTTON = 9;
protected override void WndProc(ref Message m)
{
    if (m.Msg == NativeMethods.WM_NCHITTEST)
    {
        // Get the hit test location from message parameters
        Point location = this.ParseIntPtr(m.LParam);
        location = this.GetMappedWindowPoint(location);

        // Get the hit tested element and check if it is the Maximize button
        RadElement element = this.ElementTree.GetElementAtPoint(location);
        if (element == this.FormElement.TitleBar.MaximizeButton)
        {
            m.Result = new IntPtr(HTMAXBUTTON);
            return;
        }
    }

    base.WndProc(ref m);
}

private Point ParseIntPtr(IntPtr param)
{
    if (IntPtr.Size == 4) //x86
    {
        return new Point(param.ToInt32());
    }
    else //x64
    {
        long intParam = param.ToInt64();
        short x = (short)intParam;
        short y = (short)(intParam >> 16);
        return new Point(x, y);
    }
}

protected virtual Point GetMappedWindowPoint(Point screenPoint)
{
    NativeMethods.POINT inputPoint = new NativeMethods.POINT();
    inputPoint.x = screenPoint.X;
    inputPoint.y = screenPoint.Y;

    if (this.IsHandleCreated)
    {
        NativeMethods.MapWindowPoints(new HandleRef(this, IntPtr.Zero), new HandleRef(this, this.Handle), inputPoint, 1);
    }

    return new Point(
    inputPoint.x + this.FormBehavior.ClientMargin.Left,
    inputPoint.y + this.FormBehavior.ClientMargin.Top);
}

              
Completed
Last Updated: 14 Sep 2021 07:41 by ADMIN
Release R3 2021
Created by: CHEE HANG
Comments: 0
Category: UI for WinForms
Type: Feature Request
8
Add grouping to the navigation view like attached
Completed
Last Updated: 11 May 2021 11:13 by ADMIN
Release R2 2021
Created by: atfats
Comments: 3
Category: UI for WinForms
Type: Feature Request
9

hi...

A Callout Control is in your roadmap for winforms please ?

thx in advance...

 

regards,

Completed
Last Updated: 05 May 2021 12:57 by ADMIN
Release R2 2021
Created by: n/a
Comments: 4
Category: UI for WinForms
Type: Feature Request
13
Add Office 2016 theme to the WinForms suite.
Completed
Last Updated: 22 Apr 2021 14:10 by ADMIN
Release R2 2021
Currently there is no way to customize how the UI events are handled.
Completed
Last Updated: 08 Feb 2021 13:07 by ADMIN
Release R1 2021 SP2

When importing a document containing Outlines (Bookmarks) containing Actions with an empty dictionary:

<</Title(Bookmarks)/Parent .../First .../Last .../Prev .../A<<>>/Count ...>

leads to an exception thrown: System.MissingMethodException: 'Cannot create an abstract class.'

 

1 2 3