Telerik Forums
UI for WinForms Forum
1 answer
126 views
Hello,

We currently trying the controls and encountered some bugs..
On the form load event, when setting image list to the toolbar and imagekey to a specific menu button some of the buttons does not get refresh and some do..

Is there a way to force refresh to all the buttons after changing the image key?

Thank you
Dess | Tech Support Engineer, Principal
Telerik team
 answered on 25 Oct 2013
12 answers
1.3K+ views
With RadControls 2008 Release 3 1204 (control version 8.1.0.0) I'm facing the following issue:

I handle the ValueChanging and ValueChanged events of a GridViewComboBoxColumn in a data bound GridView control. I set e.Cancel=true in the ValueChanging event handler to prevent modification of the cell value. I would expect not to receive the ValueChanged event in this case - but I'm wrong: The event will be fired although I requested to cancel the changes. Is this intended?

The second thing I don't understand is: why are the Changing / Changed events actually fired even if the cell value did not change at all?

Assume the following scenario: As I said above I have a data bound GridView with an also data bound GridViewComboBoxColumn. I drop down a cell's editor and select the entry with the same value as the cell already contains. The Changing / Changed events will be fired. Even worse, the bound data source (in my case a DataSet/DataTable) will also be changed and contains changed data rows after this - but all values of the row are obviously the same as before.

Now I could at least try to compare the old and new values of the cell manually and cancel the editing if I find that they are equal - but this won't work because of the behaviour described on top.

So could tell my if this is a bug - or at least how I can cancel the cell editing and - more important - the modification of the bound data source?

Regards,
ReneMT


Nikolay
Telerik team
 answered on 25 Oct 2013
1 answer
223 views
In the new version of the WinForms controls (2013.3.1016.40) opening a context menu will cause the form to loose focus and flash.

This also makes the context menu not close all the time on the first click away form the menu since the form regains focus on the first click and then registers the click away on the second click.

This seems to be happening on all controls even when using the default context menu like in the grid view.
George
Telerik team
 answered on 25 Oct 2013
1 answer
88 views
1. Click on a combo property to start edit
2. Move mouse over vertical center dividing line to get mouse to transition to resize pointer
3. Move moue to the right back over the combo box that has been activated for edit
4. The mouse pointer will not transition back to the arrow, it will stay on the resize pointer

I have attached an image of this.
Dimitar
Telerik team
 answered on 25 Oct 2013
3 answers
106 views
#1
How can I configure radDateTimePicker to allow any type of input so I can parse the input into a valid date (or set to null if invalid)?

Examples:

- Users want to be able to key in 7 (today's day part) and have the date parsing assume current month and year => 08/07/2013;

- Key in 9/7 ... date parsing will assume current year => 09/07/2013;

I will write the parsing rules ... but how can I configure the control to accept text only ... without the '/' and without trying to format as a date while the user is typing?


#2
How can I make the control (and all other Telerik controls) look like the rest of the controls on my form?  I am using Win7 ... but others may be on Win8 or Vista.

#3
How can I make the control not nullable - so a date must be entered?

Dess | Tech Support Engineer, Principal
Telerik team
 answered on 25 Oct 2013
1 answer
413 views
Hello,

I have a solution (see example below) how to use RadMultiColumnComboBox auto filter and it's EditorControl's column filters enabled at the same time. Howewer, there is a problem and I'd be glad if you have any solution.

I've attached a picture of working and non working example of filtering.

Filtering as shown on page http://www.telerik.com/help/winforms/multicolumncombobox-filtering.html is not enaugh for what I am trying to do.
My goal is to have RadMultiColumnComboBox auto filtering and also it's EditorControl columns filtering enabled at the same time.
This example shows how to solve this. But it only works when manipulating with short strings in the RadMultiColumnCombobox's DataSource (which is DataTable). 
But as soon as longer string is placed inside DataTable, strange problem accures. 
Try two things:
1.) Run the program. Click on the RadMultiColumnComboBox. Popup with RadGridView accures automatically. Now click on the LastName filter. Enter character 0. Filtering works for now.
2.) Now erase this character and enter another one - z. There is no last name that contains letter z, true... but that should not crach the application. The application crashes. Why? If you shorten the first name in the first row and run the application again, this doesn't happen.

Below there is a Form1.vb with all the code needed. In designer I only have one RadMulticolumnComboBox1 control, placed on Form1.

Imports Telerik.WinControls.UI
Imports Telerik.WinControls.Data
 
Public Class Form1
    Private shouldNotCancelPopup = True
 
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim dt As New DataTable
        dt.Columns.Add("FirstName")
        dt.Columns.Add("LastName")
        dt.Rows.Add("Selectt one", "")
        dt.Rows.Add("Very very loooong looong first name", "Last Name 0") 'This one is the troublemaker. I do not know why.
 
        dt.Rows.Add("Short first name 1", "Last Name 1")
        dt.Rows.Add("Short first name 2", "Last Name 2")
 
        Me.RadMultiColumnComboBox1.DataSource = dt
        Me.RadMultiColumnComboBox1.EditorControl.Rows(0).IsPinned = True
        Me.RadMultiColumnComboBox1.DisplayMember = "FirstName"
        Me.RadMultiColumnComboBox1.ValueMember = "LastName"
        setChangeableVisibilityStyle(RadMultiColumnComboBox1)
        enableEditorControlFiltering(Me.RadMultiColumnComboBox1)
        linkComboBoxFilterWithHisEditorControlFilter(RadMultiColumnComboBox1)
    End Sub
 
    Public Sub enableEditorControlFiltering(ByRef cb As RadMultiColumnComboBox)
        cb.EditorControl.ShowRowHeaderColumn = False
        cb.EditorControl.EnableFiltering = True
        cb.EditorControl.ShowFilteringRow = True
        AddHandler cb.EditorControl.MouseLeave, AddressOf cb_EditorControl_MouseLeave
        AddHandler cb.DropDownClosing, AddressOf cb_DropDownClosing
        AddHandler cb.EditorControl.CellClick, AddressOf cb_GridWithoutCheckBoxes_CellClick
    End Sub
 
    Private Sub cb_DropDownClosing(ByVal sender As System.Object, ByVal args As Telerik.WinControls.UI.RadPopupClosingEventArgs)
        If shouldNotCancelPopup Then
            args.Cancel = True       
        End If
    End Sub
 
    Private Sub cb_EditorControl_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles cb_EditorControl_MouseLeave.MouseLeave
        shouldNotCancelPopup = False
    End Sub
 
    Private Sub cb_GridWithoutCheckBoxes_CellClick(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.GridViewCellEventArgs)
        Try
            If e.RowIndex >= 0 Then            'If valid row
                shouldNotCancelPopup = False
            Else
                shouldNotCancelPopup = True
            End If
        Catch ex As Exception
        End Try
    End Sub
 
    Public Sub setChangeableVisibilityStyle(ByRef cb As RadMultiColumnComboBox)
        cb.EditorControl.BestFitColumns()
        cb.MultiColumnComboBoxElement.AutoSizeDropDownToBestFit = True
    End Sub
 
    Public Sub linkComboBoxFilterWithHisEditorControlFilter(ByVal cb As RadMultiColumnComboBox)
        cb.AutoFilter = True
        Dim filter As New FilterDescriptor()
        filter.PropertyName = cb.DisplayMember
        filter.Operator = FilterOperator.Contains
        cb.EditorControl.MasterTemplate.FilterDescriptors.Add(filter)
    End Sub
End Class

George
Telerik team
 answered on 25 Oct 2013
1 answer
104 views
Hello all,

link manager dialog displays with radtoolbar reappear above modal overlay when user clicks all properties button on insert link dialog
need to prevent users click any editor tools.
navigated code but I could not find any triggers that.
I am just assuming CSS issues.

Thank you
Kate
Telerik team
 answered on 25 Oct 2013
1 answer
139 views
Hi Telerik Team,

I have a problem with multi-column gridview printing. When I try to print a big radgridview e.g 100 rows and 50 columns everything is OK in vertical state because when is no space for rows on one page the rest is printing on another one. The problem is when there is no space for columns, then there are not moved on another page but cutted. So then I have e.g. only 30 columns instead of 50. Is there any possibility to print all of them to obtained view of whole gridview or this function is not available? It would be great if for example first column of gridview which is common to rest would be visible on each page where columns, which can't fit to the first page, were moved.

Best regards
Krystian
Ivan Petrov
Telerik team
 answered on 24 Oct 2013
4 answers
462 views
I am trying to create a hierarchy grid where the child template columns line up with the parent template columns.

To achieve this I am setting the width of the first column based on the hierarchy level.  I've found that a drop in 19 pixels makes up for the expander on the left of the row.  The other columns I have set dynamically based upon their parent column widths so that users can resize the grid and the columns will still fill the space.

The issue I am having is on initial load of the grid the columns get jumbled up.  However, after a user expands or collapses one of the columns everything lines up and works.  (See attached image).

Is there another way to achieve this that ensures that the child column are always lined up with the parent column widths?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Telerik.WinControls.UI;
 
namespace HierarchyGridExample
{
    public partial class Form1 : Form
    {
        List<MyObject> GridData = new List<MyObject>();
        int count = 1;
 
        public Form1()
        {
            InitializeComponent();
 
            grid.CellValueChanged += grid_CellValueChanged;
            grid.ColumnWidthChanged += grid_ColumnWidthChanged;
            grid.ChildViewExpanding += grid_ChildViewExpanding;
            grid.MultiSelect = true;
            grid.SelectionMode = GridViewSelectionMode.FullRowSelect;
 
            GridViewTemplate level2 = new GridViewTemplate(), level3 = new GridViewTemplate();
            CreateTemplate(grid.MasterTemplate);
            CreateTemplate(level2);
            CreateTemplate(level3);
 
            level2.ShowColumnHeaders = false;
            level3.ShowColumnHeaders = false;
 
            grid.MasterTemplate.Templates.Add(level2);
            level2.Templates.Add(level3);
             
            GridViewRelation rel1 = new GridViewRelation(grid.MasterTemplate, level2);
            rel1.ChildColumnNames.Add("Children");
            grid.Relations.Add(rel1);
 
            GridViewRelation rel2 = new GridViewRelation(level2, level3);
            rel2.ChildColumnNames.Add("Children");
            grid.Relations.Add(rel2);
 
            /*CreateTemplate(grid.MasterTemplate);
 
            GridViewTemplate template = new GridViewTemplate();
            CreateTemplate(template);
            grid.MasterTemplate.Templates.Add(template);
            template.ShowFilteringRow = false;
 
            // Setup child relation
            GridViewRelation relation = new GridViewRelation(grid.MasterTemplate, template);
            relation.RelationName = "Children";
            relation.ChildColumnNames.Add("TopChildren");
            grid.Relations.Add(relation);
 
            CreateChildTemplate(template, 0);*/
 
            LoadData(true);
            grid.MasterTemplate.ExpandAll();
        }
 
        #region Editing
 
        void grid_CellValueChanged(object sender, GridViewCellEventArgs e)
        {
            if (e.Column.Name == "Enabled")
            {
                (e.Row.DataBoundItem as MyObject).Enabled = (bool)e.Value;
            }
        }
 
        #endregion Editing
 
        #region Formatting
 
        private void grid_CellFormatting(object sender, CellFormattingEventArgs e)
        {
            if (e.Column.Name == "HLevel")
            {
                e.CellElement.Text = e.Row.HierarchyLevel.ToString();
            }
            if (e.Column.Name == "Name")
            {
                /*e.CellElement.TextImageRelation = TextImageRelation.ImageBeforeText;
                e.CellElement.TextAlignment = ContentAlignment.MiddleLeft;
                e.CellElement.ImageAlignment = ContentAlignment.MiddleLeft;
                e.CellElement.Image = Properties.Resources.Radio;*/
                if (e.Row.HierarchyLevel == 0 && e.Column.Width != 150)
                {
                    e.Column.Width = 150;
                    e.Column.MaxWidth = 150;
                    e.Column.MinWidth = 150;
                }
                else if (e.Column.Width != 131 && e.Row.HierarchyLevel > 0)
                {
                    e.Column.Width = 131;
                    e.Column.MaxWidth = 131;
                    e.Column.MinWidth = 131;
                }
            }
            else
            {
                e.CellElement.Image = null;
            }
        }
 
        private void grid_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
        {
            if (e.ColumnIndex > 0)
            {
                int masterWidth = grid.MasterTemplate.Columns[e.ColumnIndex].Width;
                int child1Width = grid.MasterTemplate.Templates[0].Columns[e.ColumnIndex].Width;
                int child2Width = grid.MasterTemplate.Templates[0].Templates[0].Columns[e.ColumnIndex].Width;
                if (masterWidth != child1Width)
                {
                    grid.MasterTemplate.Templates[0].Columns[e.ColumnIndex].Width = masterWidth;
                    //grid.MasterTemplate.Templates[0].Refresh();
                }
                if (masterWidth != child2Width)
                {
                    grid.MasterTemplate.Templates[0].Templates[0].Columns[e.ColumnIndex].Width = masterWidth;
                    //grid.MasterTemplate.Templates[0].Templates[0].Refresh();
                }
            }
        }
 
        #endregion Formatting
 
        #region Expand
 
        private void grid_ChildViewExpanding(object sender, ChildViewExpandingEventArgs e)
        {
            if (!e.IsExpanded && e.ParentRow.ChildRows.Any())
            {
                List<GridViewTemplate> temps = new List<GridViewTemplate>();
                if (grid.MasterTemplate.Templates.Any())
                {
                    temps.Add(grid.MasterTemplate.Templates[0]);
                    if (grid.MasterTemplate.Templates[0].Templates.Any())
                    {
                        temps.Add(grid.MasterTemplate.Templates[0].Templates[0]);
                    }
                }
                for (int x = 1; x < grid.MasterTemplate.Columns.Count; x++)
                {
                    temps.ForEach(c => c.Columns[x].Width = grid.MasterTemplate.Columns[x].Width);
                }
            }
        }
 
        private void RestoreExpanded(GridViewRowInfo g, HashSet<object> expanded)
        {
            using (grid.DeferRefresh())
            {
                if (g == null)
                {
                    foreach (var item in this.grid.Rows)
                    {
                        if (expanded.Contains(item.DataBoundItem))
                        {
                            item.IsExpanded = true;
                        }
                        foreach (var child in item.ChildRows)
                        {
                            RestoreExpanded(child, expanded);
                        }
                    }
                }
                else
                {
                    if (expanded.Contains(g.DataBoundItem))
                    {
                        g.IsExpanded = true;
                    }
                    foreach (var child in g.ChildRows)
                    {
                        RestoreExpanded(child, expanded);
                    }
                }
            }
        }
 
        private void SaveExpanded(GridViewRowInfo g, HashSet<object> items)
        {
            if (g == null)
            {
                foreach (var item in this.grid.Rows)
                {
                    if (item.IsExpanded)
                    {
                        items.Add(item.DataBoundItem);
                    }
                    foreach (var child in item.ChildRows)
                    {
                        SaveExpanded(child, items);
                    }
                }
            }
            else
            {
                if (g.IsExpanded)
                {
                    items.Add(g.DataBoundItem);
                }
                foreach (var child in g.ChildRows)
                {
                    SaveExpanded(child, items);
                }
            }
        }
 
        #endregion Expand
 
        #region Data
 
        private void LoadData(bool createTestData = false)
        {
            using (grid.DeferRefresh())
            {
                HashSet<object> expanded = new HashSet<object>();
                SaveExpanded(null, expanded);
 
                grid.DataSource = null;
                if (createTestData)
                {
                    GridData = new List<MyObject>();
                    MyObject m1 = new MyObject("Test " + count);
                    count++;
                    LoadChild(m1, 3);
                    GridData.Add(m1);
                    MyObject m2 = new MyObject("Test " + count);
                    count++;
                    LoadChild(m2, 3);
                    GridData.Add(m2);
                    MyObject m3 = new MyObject("Test " + count);
                    count++;
                    LoadChild(m3, 3);
                    GridData.Add(m3);
                }
                grid.DataSource = GridData;
                 
                RestoreExpanded(null, expanded);
            }
        }
 
        private void LoadChild(MyObject parent, int number, int level = 0)
        {
            level++;
            for (int i = 0; i < number; i++)
            {
                MyObject m2 = new MyObject("Test " + count, count % 2 == 0);
                count++;
                parent.Children.Add(m2);
                m2.Parent = parent;
                if (level < 2)
                {
                    LoadChild(m2, number, level);
                }
            }
        }
 
        private void CreateChild(MyObject parent = null)
        {
            if (parent != null)
            {
                MyObject m2 = new MyObject("Test " + count, count % 2 == 0);
                count++;
                parent.Children.Add(m2);
                m2.Parent = parent;
                //parent.Children.ResetBindings();
            }
            else
            {
                MyObject m2 = new MyObject("Test " + count, count % 2 == 0);
                count++;
                GridData.Add(m2);
            }
            LoadData();
        }
 
        #endregion Data
 
        #region Template
 
        private void CreateTemplate(GridViewTemplate t, bool isMaster = false)
        {
            t.Columns.Clear();
            t.AutoGenerateColumns = false;
            t.ShowFilteringRow = false;
            t.EnableGrouping = false;
            t.AllowAddNewRow = false;
            t.EnableFiltering = true;
            t.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
 
            GridViewTextBoxColumn colName = new GridViewTextBoxColumn("Name");
            colName.HeaderText = "Name";
            colName.Name = "Name";
            t.Columns.Add(colName);
 
            GridViewTextBoxColumn colH = new GridViewTextBoxColumn();
            colH.HeaderText = "H Level";
            colH.Name = "HLevel";
            colH.ReadOnly = true;
            t.Columns.Add(colH);
 
            GridViewCheckBoxColumn colEnabled = new GridViewCheckBoxColumn("Enabled");
            colEnabled.HeaderText = "Enabled";
            colEnabled.Name = "Enabled";
            t.Columns.Add(colEnabled);
 
            GridViewTextBoxColumn col4 = new GridViewTextBoxColumn();
            col4.HeaderText = "Col 4";
            col4.Name = "Col4";
            col4.ReadOnly = true;
            t.Columns.Add(col4);
        }
 
        private void CreateChildTemplate(GridViewTemplate parent, int x)
        {
            GridViewTemplate template = new GridViewTemplate();
            CreateTemplate(template);
            template.ShowChildViewCaptions = false;
            template.ShowColumnHeaders = false;
            template.ShowFilteringRow = false;
 
            parent.Templates.Add(template);
            GridViewRelation r = new GridViewRelation(parent, template);
            r.ChildColumnNames.Add("Children");
            grid.Relations.Add(r);
 
            if (x < 10)
            {
                x++;
                CreateChildTemplate(template, x);
            }
        }
 
        private void UpdateTemplates(GridViewTemplate t)
        {
            t.Refresh();
            foreach (GridViewTemplate g in t.Templates)
            {
                UpdateTemplates(g);
            }
        }
 
        #endregion Template
 
        #region Buttons
 
        private void buttonReload_Click(object sender, EventArgs e)
        {
            LoadData();
        }
 
        private void buttonAddPeer_Click(object sender, EventArgs e)
        {
            if (grid.SelectedRows.Count == 1 && grid.SelectedRows[0].DataBoundItem != null && grid.SelectedRows[0].DataBoundItem is MyObject)
            {
                CreateChild((grid.SelectedRows[0].DataBoundItem as MyObject).Parent);
            }
            else
            {
                CreateChild();
            }
        }
 
        private void buttonAddChild_Click(object sender, EventArgs e)
        {
            if (grid.SelectedRows.Count == 1 && grid.SelectedRows[0].DataBoundItem != null)
            {
                CreateChild(grid.SelectedRows[0].DataBoundItem as MyObject);
            }
            else
            {
                CreateChild();
            }
        }
 
        private void buttonCollapse_Click(object sender, EventArgs e)
        {
            grid.MasterTemplate.CollapseAll();
        }
 
        private void buttonExpand_Click(object sender, EventArgs e)
        {
            grid.MasterTemplate.ExpandAll();
        }
 
        #endregion Buttons
    }
 
    public class MyObject
    {
        public MyObject Parent { get; set; }
 
        public string Name { get; set; }
 
        public bool Enabled { get; set; }
 
        public BindingList<MyObject> Children { get; set; }
 
        public MyObject(string name)
        {
            this.Enabled = true;
            this.Name = name;
            Children = new BindingList<MyObject>();
        }
        public MyObject(string name, bool enabled)
        {
            this.Enabled = enabled;
            this.Name = name;
            Children = new BindingList<MyObject>();
        }
    }
}
Dess | Tech Support Engineer, Principal
Telerik team
 answered on 24 Oct 2013
1 answer
86 views
Hello,

is there a opportunity to exclude the Suggests from the SelectedIndexChange?

I want to create a function, which reacts only, when the user really chooses an item by clicking or pressing the enter key. In the moment my function fires every time, when the user goes with the keyboard arrows through the suggested items.

Maybe theres another way then to react to the SelectedIndexChange?

Thanks for advices!

Greets
Dimitar
Telerik team
 answered on 24 Oct 2013
Narrow your results
Selected tags
Tags
GridView
General Discussions
Scheduler and Reminder
Treeview
Dock
RibbonBar
Themes and Visual Style Builder
ChartView
Calendar, DateTimePicker, TimePicker and Clock
DropDownList
Buttons, RadioButton, CheckBox, etc
ListView
ComboBox and ListBox (obsolete as of Q2 2010)
Chart (obsolete as of Q1 2013)
Form
PageView
MultiColumn ComboBox
TextBox
RichTextEditor
PropertyGrid
Menu
RichTextBox (obsolete as of Q3 2014 SP1)
Panelbar (obsolete as of Q2 2010)
PivotGrid and PivotFieldList
Tabstrip (obsolete as of Q2 2010)
MaskedEditBox
CommandBar
PdfViewer and PdfViewerNavigator
ListControl
Carousel
GanttView
Diagram, DiagramRibbonBar, DiagramToolBox
Panorama
New Product Suggestions
Toolstrip (obsolete as of Q3 2010)
VirtualGrid
AutoCompleteBox
Label
Spreadsheet
ContextMenu
Panel
Visual Studio Extensions
TitleBar
Documentation
SplitContainer
Map
DesktopAlert
CheckedDropDownList
ProgressBar
TrackBar
MessageBox
Rotator
SpinEditor
CheckedListBox
StatusStrip
LayoutControl
SyntaxEditor
Wizard
ShapedForm
TextBoxControl
Conversational UI, Chat
DateTimePicker
CollapsiblePanel
TabbedForm
CAB Enabling Kit
GroupBox
WaitingBar
DataEntry
ScrollablePanel
ScrollBar
ImageEditor
Tools - VSB, Control Spy, Shape Editor
BrowseEditor
DataFilter
ColorDialog
FileDialogs
Gauges (RadialGauge, LinearGauge, BulletGraph)
ApplicationMenu
RangeSelector
CardView
WebCam
Barcode
BindingNavigator
PopupEditor
RibbonForm
Styling
TaskBoard
Callout
ColorBox
PictureBox
FilterView
NavigationView
Accessibility
VirtualKeyboard
DataLayout
ToastNotificationManager
ValidationProvider
CalculatorDropDown
Licensing
Localization
TimePicker
ButtonTextBox
FontDropDownList
BarcodeView
BreadCrumb
Security
LocalizationProvider
Dictionary
Overlay
Flyout
Separator
SparkLine
TreeMap
StepProgressBar
SplashScreen
ToolbarForm
NotifyIcon
DateOnlyPicker
Rating
TimeSpanPicker
Calculator
OfficeNavigationBar
TaskbarButton
HeatMap
SlideView
PipsPager
AIPrompt
TaskDialog
TimeOnlyPicker
+? more
Top users last month
Rob
Top achievements
Rank 3
Iron
Iron
Iron
Atul
Top achievements
Rank 1
Iron
Iron
Iron
Alexander
Top achievements
Rank 1
Veteran
Iron
Serkan
Top achievements
Rank 1
Iron
Shawn
Top achievements
Rank 1
Iron
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Rob
Top achievements
Rank 3
Iron
Iron
Iron
Atul
Top achievements
Rank 1
Iron
Iron
Iron
Alexander
Top achievements
Rank 1
Veteran
Iron
Serkan
Top achievements
Rank 1
Iron
Shawn
Top achievements
Rank 1
Iron
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?