This is a migrated thread and some comments may be shown as answers.

Problem with RadDropDownListEditor when RadDropDownStyle.DropDown and AutoCompleteMode.SuggestAppend

29 Answers 314 Views
GridView
This is a migrated thread and some comments may be shown as answers.
Raymond
Top achievements
Rank 1
Raymond asked on 14 Jan 2011, 03:43 PM

 

Hi

 

 

I created this example to show problem that occurs in my real application.

 

This is my source code:

 

 

public class MyClass
{
    public string MyProperty { get; set; }
}

public partial class Form1 : Form
{
    private List<MyClass> _myList = new List<MyClass>();
    public Form1()
    {
        InitializeComponent();
        radGridView1.DataSource = _myList;
        radGridView1.Columns[0].Width = 200;
    }
    private void radGridView1_EditorRequired(object sender, Telerik.WinControls.UI.EditorRequiredEventArgs e)
    {
        RadDropDownListEditor editor = new RadDropDownListEditor();
        RadDropDownListEditorElement editorElement = editor.EditorElement as RadDropDownListEditorElement;
        editorElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown;
        editorElement.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        e.Editor = editor;
        e.EditorType = typeof(RadDropDownListEditor);
    }
}


When I want add new row I type something in cell and I press ENTER but new row is not added. Cell is cleared.

 

If I don`t use custom editor (comment out code in EditorRequired handler) on ENTER pressed new row is added with typed value.        

 

How to solve this issue when I use custom editor?

 

Regards

29 Answers, 1 is accepted

Sort by
0
Richard Slade
Top achievements
Rank 2
answered on 14 Jan 2011, 04:39 PM
Hi Raymond,

Are you wanting auto complete on the add new row section? The sample below just shows a simple implementation of using a drop down column. The values will appear in a drop down in the add new row. Is this what you want to do? If you could let me know any changes you want to make, I'll do my best to help
thanks
Richard

Designer File
namespace RadGridView_Basic_C
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components;
  
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
  
        #region Windows Form Designer generated code
  
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.radGridView1 = new Telerik.WinControls.UI.RadGridView();
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // radGridView1
            // 
            this.radGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.radGridView1.Location = new System.Drawing.Point(0, 0);
            this.radGridView1.Name = "radGridView1";
            this.radGridView1.Size = new System.Drawing.Size(457, 411);
            this.radGridView1.TabIndex = 0;
            this.radGridView1.Text = "radGridView1";
              
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(457, 411);
            this.Controls.Add(this.radGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit();
            this.ResumeLayout(false);
  
        }
  
        #endregion
  
        private Telerik.WinControls.UI.RadGridView radGridView1;
    }
}

Form1.cs
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;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI.Export;
using Telerik.WinControls.UI.Export.HTML;
using Telerik.WinControls.RadControlSpy;
  
  
namespace RadGridView_Basic_C
{
    public partial class Form1 : Form
    {
  
        private List<Person> m_myList = new List<Person>();
        private List<City> m_CityList = new List<City>();
  
        public Form1()
        {
            InitializeComponent();
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
            this.radGridView1.AutoGenerateColumns = false;
            this.radGridView1.AllowAddNewRow = true;
            this.radGridView1.AllowEditRow = true;
  
            m_myList.Add(new Person(1, "Richard", 1));
            m_myList.Add(new Person(1, "Stew", 2));
            m_myList.Add(new Person(1, "Chris", 3));
            m_myList.Add(new Person(1, "Peter", 4));
            radGridView1.DataSource = m_myList;
  
  
            m_CityList.Add(new City(1, "Bournemouth"));
            m_CityList.Add(new City(2, "Christchurch"));
            m_CityList.Add(new City(3, "Lymington"));
            m_CityList.Add(new City(4, "Bearwood"));
            m_CityList.Add(new City(5, "Southampton"));
  
            GridViewDecimalColumn idColumn = new GridViewDecimalColumn();
            idColumn.Name = "Id";
            idColumn.HeaderText = "Id";
            idColumn.FieldName = "Id";
            this.radGridView1.Columns.Add(idColumn);
  
            GridViewTextBoxColumn nameColumn = new GridViewTextBoxColumn();
            nameColumn.Name = "Name";
            nameColumn.HeaderText = "Name";
            nameColumn.FieldName = "Name";
            this.radGridView1.Columns.Add(nameColumn);
  
            GridViewComboBoxColumn cityColumn = new GridViewComboBoxColumn("City", "City");
            cityColumn.DataSource = m_CityList;
            cityColumn.DisplayMember = "Name";
            cityColumn.ValueMember = "Id";
            this.radGridView1.Columns.Add(cityColumn);  
        }
  
    }
  
    class Person
    {
        public Person()
        {}
  
        public Person(int id, string name, int city)
        {
            this.Id = id;
            this.Name = name;
            this.City = city;
        }
  
        public int Id { get; set; } 
        public string Name { get; set; }
        public int City { get; set; }
    }
  
    class City
    {
        public City()
        {}
  
        public City(int Id, string name)
        {
            this.Id = Id;
            this.Name = name;
        }
  
        public int Id { get; set; }
        public string Name { get; set; }
    }
  }

0
Richard Slade
Top achievements
Rank 2
answered on 14 Jan 2011, 04:54 PM
And if you just want it as a textbox column with autocomplete on the editor...


Designer File
namespace RadGridView_Basic_C
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components;
  
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
  
        #region Windows Form Designer generated code
  
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.radGridView1 = new Telerik.WinControls.UI.RadGridView();
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // radGridView1
            // 
            this.radGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.radGridView1.Location = new System.Drawing.Point(0, 0);
            this.radGridView1.Name = "radGridView1";
            this.radGridView1.Size = new System.Drawing.Size(457, 411);
            this.radGridView1.TabIndex = 0;
            this.radGridView1.Text = "radGridView1";
              
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(457, 411);
            this.Controls.Add(this.radGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit();
            this.ResumeLayout(false);
  
        }
  
        #endregion
  
        private Telerik.WinControls.UI.RadGridView radGridView1;
    }
}

Form1.cs
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;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI.Export;
using Telerik.WinControls.UI.Export.HTML;
using Telerik.WinControls.RadControlSpy;
  
  
namespace RadGridView_Basic_C
{
    public partial class Form1 : Form
    {
  
        private List<Person> m_myList = new List<Person>();
        private List<City> m_CityList = new List<City>();
  
        public Form1()
        {
            InitializeComponent();
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
            this.radGridView1.AutoGenerateColumns = false;
            this.radGridView1.AllowAddNewRow = true;
            this.radGridView1.AllowEditRow = true;
  
            m_myList.Add(new Person(1, "Richard", "Bournemouth"));
            m_myList.Add(new Person(1, "Stew", "Christchurch"));
            m_myList.Add(new Person(1, "Chris", "Bearwood"));
            m_myList.Add(new Person(1, "Peter", "Southampton"));
            radGridView1.DataSource = m_myList;
  
  
            m_CityList.Add(new City(1, "Bournemouth"));
            m_CityList.Add(new City(2, "Christchurch"));
            m_CityList.Add(new City(3, "Lymington"));
            m_CityList.Add(new City(4, "Bearwood"));
            m_CityList.Add(new City(5, "Southampton"));
  
            GridViewDecimalColumn idColumn = new GridViewDecimalColumn();
            idColumn.Name = "Id";
            idColumn.HeaderText = "Id";
            idColumn.FieldName = "Id";
            this.radGridView1.Columns.Add(idColumn);
  
            GridViewTextBoxColumn nameColumn = new GridViewTextBoxColumn();
            nameColumn.Name = "Name";
            nameColumn.HeaderText = "Name";
            nameColumn.FieldName = "Name";
            this.radGridView1.Columns.Add(nameColumn);
  
            GridViewTextBoxColumn cityColumn = new GridViewTextBoxColumn();
            cityColumn.Name = "City";
            cityColumn.HeaderText = "City";
            cityColumn.FieldName = "City";
            this.radGridView1.Columns.Add(cityColumn);
  
            this.radGridView1.EditorRequired += new Telerik.WinControls.UI.EditorRequiredEventHandler(this.radGridView1_EditorRequired);
   
        }
  
        private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
        {
            if (this.radGridView1.CurrentColumn.Name == "City")
            
                RadDropDownListEditor editor = new RadDropDownListEditor();
                RadDropDownListEditorElement editorElement = editor.EditorElement as RadDropDownListEditorElement;
                editorElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown;
                editorElement.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                editorElement.DataSource = m_CityList;
                editorElement.DisplayMember = "Name";
                editorElement.ValueMember = "Name";
                e.Editor = editor;
                e.EditorType = typeof(RadDropDownListEditor);           
            }
  
        }
  
    }
  
    class Person
    {
        public Person()
        {}
  
        public Person(int id, string name, string city)
        {
            this.Id = id;
            this.Name = name;
            this.City = city;
        }
  
        public int Id { get; set; } 
        public string Name { get; set; }
        public string City { get; set; }
    }
  
    class City
    {
        public City()
        {}
  
        public City(int Id, string name)
        {
            this.Id = Id;
            this.Name = name;
        }
  
        public int Id { get; set; }
        public string Name { get; set; }
    }
  }

Hope that helps
Richard
0
Raymond
Top achievements
Rank 1
answered on 17 Jan 2011, 09:56 AM

Hi

It doesn`t solve my problem.

  1. I cannot use column GridViewComboBoxColumn because I need drop down control only in some rows.
  2. In your code (with EditorRequired handler) source for RadDropDownListEditorElement is list with cities. Object city has id and name – if I type something that is not in this list and I press enter cell is cleared.

 

In my case source is just list with strings and I want have possibility typing also something new that is not in the list. Good example is filed in web browser where you type www address – you can type something new or selected address from drop down list.

 

Regards

0
Richard Slade
Top achievements
Rank 2
answered on 17 Jan 2011, 02:35 PM
Hi Raymond,

Please can you try the following

Dersigner File
namespace RadGridView_Basic_C
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components;
  
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
  
        #region Windows Form Designer generated code
  
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.radGridView1 = new Telerik.WinControls.UI.RadGridView();
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // radGridView1
            // 
            this.radGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.radGridView1.Location = new System.Drawing.Point(0, 0);
            this.radGridView1.Name = "radGridView1";
            this.radGridView1.Size = new System.Drawing.Size(457, 411);
            this.radGridView1.TabIndex = 0;
            this.radGridView1.Text = "radGridView1";
            this.radGridView1.EditorRequired += new Telerik.WinControls.UI.EditorRequiredEventHandler(this.radGridView1_EditorRequired);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(457, 411);
            this.Controls.Add(this.radGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit();
            this.ResumeLayout(false);
  
        }
  
        #endregion
  
        private Telerik.WinControls.UI.RadGridView radGridView1;
    }
}


Form1.cs
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;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI.Export;
using Telerik.WinControls.UI.Export.HTML;
using Telerik.WinControls.RadControlSpy;
  
  
namespace RadGridView_Basic_C
{
    public partial class Form1 : Form
    {
  
        private List<Person> m_myList = new List<Person>();
        List<String> cities = new List<string>();
  
        public Form1()
        {
            InitializeComponent();
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
            this.radGridView1.AutoGenerateColumns = false;
            this.radGridView1.AllowAddNewRow = true;
            this.radGridView1.AllowEditRow = true;
  
            m_myList.Add(new Person(1, "Richard", "Bournemouth"));
            m_myList.Add(new Person(1, "Stew", "Christchurch"));
            m_myList.Add(new Person(1, "Chris", "Bearwood"));
            m_myList.Add(new Person(1, "Peter", "Southampton"));
            radGridView1.DataSource = m_myList;
  
  
            GridViewDecimalColumn idColumn = new GridViewDecimalColumn();
            idColumn.Name = "Id";
            idColumn.HeaderText = "Id";
            idColumn.FieldName = "Id";
            this.radGridView1.Columns.Add(idColumn);
  
            GridViewTextBoxColumn nameColumn = new GridViewTextBoxColumn();
            nameColumn.Name = "Name";
            nameColumn.HeaderText = "Name";
            nameColumn.FieldName = "Name";
            this.radGridView1.Columns.Add(nameColumn);
  
            GridViewTextBoxColumn cityColumn = new GridViewTextBoxColumn();
            cityColumn.Name = "City";
            cityColumn.HeaderText = "City";
            cityColumn.FieldName = "City";
            this.radGridView1.Columns.Add(cityColumn);
  
            this.radGridView1.CellEditorInitialized += new Telerik.WinControls.UI.GridViewCellEventHandler(this.radGridView1_CellEditorInitialized);
  
  
        }
  
  
        private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
        {
            if (e.ActiveEditor is CustomEditor)
            {
                var dropDowneditor = e.ActiveEditor as CustomEditor;
                if (dropDowneditor == null)
                {
                    return;
                }
  
                var hostItem = dropDowneditor.EditorElement as RadHostItem;
               var dropDown = hostItem.HostedControl as RadDropDownList;
  
                var autocompleteStringCollection = new AutoCompleteStringCollection();
                foreach (var row in radGridView1.Rows)
                {
                    var value = row.Cells["City"].Value;
                    if (value != null)
                    {
                        var valueString = value.ToString();
                        if (!autocompleteStringCollection.Contains(valueString))
                        {
                            autocompleteStringCollection.Add(valueString);
                        }
                    }
                }
  
                dropDown.DataSource = autocompleteStringCollection;
                dropDown.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                dropDown.AutoCompleteDataSource = autocompleteStringCollection;
                dropDown.Focus();
                dropDown.DropDownListElement.TextBox.KeyDown += new KeyEventHandler(TextBox_KeyDown);
  
            }
        }
  
        private void TextBox_KeyDown(Object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.radGridView1.EndEdit();
            }
        }
  
  
        private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
        {
            if (this.radGridView1.CurrentColumn.Name == "City")
            {
                if (e.EditorType == typeof(RadTextBoxEditor))
                {
                    e.EditorType = typeof(CustomEditor);
                    var editor = new CustomEditor();
                }
  
            }
  
        }
  
  
  
    }
  
    class Person
    {
        public Person()
        { }
  
        public Person(int id, string name, string city)
        {
            this.Id = id;
            this.Name = name;
            this.City = city;
        }
  
        public int Id { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
    }
  
    public class CustomEditor : BaseGridEditor
    {
        private RadDropDownList radDropDown;
  
        public CustomEditor()
        {
            radDropDown = new RadDropDownList();
        }
  
  
        protected override RadElement CreateEditorElement()
        {
            return new RadHostItem(radDropDown);
        }
  
        public override object Value
        {
            get
            {
                return radDropDown.Text;
            }
            set
            {
                radDropDown.Text = value.ToString();
            }
        }
    }
  
}

Hope that helps
Richard
0
Raymond
Top achievements
Rank 1
answered on 18 Jan 2011, 10:31 AM

It is almost perfect but there is one issue.

If I select some cell in column city and I expand list 2, 3 times I am not able to expand list more times.

When I click button with arrow down list is expanded but immediately collapsed – don’t change selected cell during these clicks to see this problem.

Any ideas?

Regards

0
Richard Slade
Top achievements
Rank 2
answered on 18 Jan 2011, 11:48 AM
Hi Raymond,

Yes, I see now that this is an issue. I'll look into it. Perhaps there is something I've done wrong. I'll try and get back to you as soon as I can
Richard
0
Richard Slade
Top achievements
Rank 2
answered on 18 Jan 2011, 01:03 PM
Hi Raymond,

ok, this should be fine now. Replace the CustomEditor that I gave you before with this one.

public class CustomEditor : BaseGridEditor
{
    private RadDropDownList radDropDown;
    public CustomEditor()
    {
        radDropDown = new RadDropDownList();
        radDropDown.DropDownListElement.SelectionMode = SelectionMode.One;
        radDropDown.PopupClosed += new RadPopupClosedEventHandler(radDropDown_PopUpClosed);
    }
    private void radDropDown_PopUpClosed(Object sender, RadPopupClosedEventArgs e)
    {
        this.radDropDown.DropDownListElement.TextBox.TextBoxItem.PerformClick();
    }
    protected override RadElement CreateEditorElement()
    {
        return new RadHostItem(radDropDown);
    }
    public override object Value
    {
        get
        {
            return radDropDown.Text;
        }
        set
        {
            radDropDown.Text = value.ToString();
        }
    }
}

Hope that helps
Richard
0
Raymond
Top achievements
Rank 1
answered on 18 Jan 2011, 01:39 PM

It did not help.

I still have the same problem.

If I click couple times on button with arrow down (on the same cell) list is expanded and collapsed immediately.

0
Richard Slade
Top achievements
Rank 2
answered on 18 Jan 2011, 01:45 PM
Apologies. I was sure that was working when I left it, but you're right. I'll see what I can do and come back to you.
Richard
0
Richard Slade
Top achievements
Rank 2
answered on 18 Jan 2011, 03:31 PM
Hi Raymond,

Ok, my fault, we didn't need the custom editor. Please can you try the following. I'm pretty confident that this is fine now, but any issues let me know

Designer File
namespace RadGridView_Basic_C
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components;
  
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
  
        #region Windows Form Designer generated code
  
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.radGridView1 = new Telerik.WinControls.UI.RadGridView();
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // radGridView1
            // 
            this.radGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.radGridView1.Location = new System.Drawing.Point(0, 0);
            this.radGridView1.Name = "radGridView1";
            this.radGridView1.Size = new System.Drawing.Size(457, 411);
            this.radGridView1.TabIndex = 0;
            this.radGridView1.Text = "radGridView1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(457, 411);
            this.Controls.Add(this.radGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit();
            this.ResumeLayout(false);
  
        }
  
        #endregion
  
        private Telerik.WinControls.UI.RadGridView radGridView1;
    }
}

Form1.cs
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;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI.Export;
using Telerik.WinControls.UI.Export.HTML;
using Telerik.WinControls.RadControlSpy;
  
  
namespace RadGridView_Basic_C
{
    public partial class Form1 : Form
    {
  
        private List<Person> m_myList = new List<Person>();
        List<String> cities = new List<string>();
  
        public Form1()
        {
            InitializeComponent();
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
  
  
            this.radGridView1.AutoGenerateColumns = false;
            this.radGridView1.AllowAddNewRow = true;
            this.radGridView1.AllowEditRow = true;
  
            m_myList.Add(new Person(1, "Richard", "Bournemouth"));
            m_myList.Add(new Person(1, "Stew", "Christchurch"));
            m_myList.Add(new Person(1, "Chris", "Bearwood"));
            m_myList.Add(new Person(1, "Peter", "Southampton"));
            radGridView1.DataSource = m_myList;
  
  
            GridViewDecimalColumn idColumn = new GridViewDecimalColumn();
            idColumn.Name = "Id";
            idColumn.HeaderText = "Id";
            idColumn.FieldName = "Id";
            this.radGridView1.Columns.Add(idColumn);
  
            GridViewTextBoxColumn nameColumn = new GridViewTextBoxColumn();
            nameColumn.Name = "Name";
            nameColumn.HeaderText = "Name";
            nameColumn.FieldName = "Name";
            this.radGridView1.Columns.Add(nameColumn);
  
            GridViewComboBoxColumn cityColumn = new GridViewComboBoxColumn();
            cityColumn.Name = "City";
            cityColumn.HeaderText = "City";
            cityColumn.FieldName = "City";
            this.radGridView1.Columns.Add(cityColumn);
  
            this.radGridView1.CellEditorInitialized += new Telerik.WinControls.UI.GridViewCellEventHandler(this.radGridView1_CellEditorInitialized);
        }
  
  
        private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
        {
            RadDropDownListEditor listEditor = this.radGridView1.ActiveEditor as RadDropDownListEditor;
  
            if (listEditor == null)
            {
                return;
            }
  
            RadDropDownListEditorElement editorElement = listEditor.EditorElement as RadDropDownListEditorElement;
            editorElement.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            editorElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown;
  
            var autocompleteStringCollection = new AutoCompleteStringCollection();
            foreach (var row in radGridView1.Rows)
            {
                var value = row.Cells["City"].Value;
                if (value != null)
                {
                    var valueString = value.ToString();
                    if (!autocompleteStringCollection.Contains(valueString))
                    {
                        autocompleteStringCollection.Add(valueString);
                    }
                }
            }
  
            editorElement.DataSource = autocompleteStringCollection;
            editorElement.SelectedValue = this.radGridView1.CurrentCell.Value;
        }
  
  
        private void TextBox_KeyDown(Object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.radGridView1.EndEdit();
            }
        }
  
    }
  
    class Person
    {
        public Person()
        { }
  
        public Person(int id, string name, string city)
        {
            this.Id = id;
            this.Name = name;
            this.City = city;
        }
  
        public int Id { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
    }
  
  
}

Thanks
Richard
0
Raymond
Top achievements
Rank 1
answered on 18 Jan 2011, 03:40 PM

Ok problem with immediately collapsing list is resolved but we returned to my first issue.

When I type something that is not in the list and I press enter value in cell is changed to value from list, in the result typed value that is not in the list is canceled.

0
Raymond
Top achievements
Rank 1
answered on 18 Jan 2011, 03:43 PM

There is also another issue: if you click couple times in different cells from column city after some click text in clicked cell will be changed to empty.

0
Richard Slade
Top achievements
Rank 2
answered on 18 Jan 2011, 04:22 PM
Hi Raymond,

Please can you try this. I'm rather busy at the moment so the amount of time I can spend on it is limited, but if you let me know how that is, i'll spend some more on it this evening if needs be

Designer
namespace RadGridView_Basic_C
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components;
  
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
  
        #region Windows Form Designer generated code
  
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.radGridView1 = new Telerik.WinControls.UI.RadGridView();
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // radGridView1
            // 
            this.radGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.radGridView1.Location = new System.Drawing.Point(0, 0);
            this.radGridView1.Name = "radGridView1";
            this.radGridView1.Size = new System.Drawing.Size(457, 411);
            this.radGridView1.TabIndex = 0;
            this.radGridView1.Text = "radGridView1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(457, 411);
            this.Controls.Add(this.radGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit();
            this.ResumeLayout(false);
  
        }
  
        #endregion
  
        private Telerik.WinControls.UI.RadGridView radGridView1;
    }
}

Form1.cs
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;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI.Export;
using Telerik.WinControls.UI.Export.HTML;
using Telerik.WinControls.RadControlSpy;
  
  
namespace RadGridView_Basic_C
{
    public partial class Form1 : Form
    {
  
        private List<Person> m_myList = new List<Person>();
        List<String> cities = new List<string>();
        private String editorText = "";
        private RadTextBoxItem textBoxItem;
  
        public Form1()
        {
            InitializeComponent();
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
  
  
            this.radGridView1.AutoGenerateColumns = false;
            this.radGridView1.AllowAddNewRow = true;
            this.radGridView1.AllowEditRow = true;
  
            m_myList.Add(new Person(1, "Richard", "Bournemouth"));
            m_myList.Add(new Person(1, "Stew", "Christchurch"));
            m_myList.Add(new Person(1, "Chris", "Bearwood"));
            m_myList.Add(new Person(1, "Peter", "Southampton"));
            radGridView1.DataSource = m_myList;
  
  
            GridViewDecimalColumn idColumn = new GridViewDecimalColumn();
            idColumn.Name = "Id";
            idColumn.HeaderText = "Id";
            idColumn.FieldName = "Id";
            this.radGridView1.Columns.Add(idColumn);
  
            GridViewTextBoxColumn nameColumn = new GridViewTextBoxColumn();
            nameColumn.Name = "Name";
            nameColumn.HeaderText = "Name";
            nameColumn.FieldName = "Name";
            this.radGridView1.Columns.Add(nameColumn);
  
            GridViewComboBoxColumn cityColumn = new GridViewComboBoxColumn();
            cityColumn.Name = "City";
            cityColumn.HeaderText = "City";
            cityColumn.FieldName = "City";
            this.radGridView1.Columns.Add(cityColumn);
  
            this.radGridView1.CellEditorInitialized += new Telerik.WinControls.UI.GridViewCellEventHandler(this.radGridView1_CellEditorInitialized);
        }
  
  
        private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
        {
            RadDropDownListEditor listEditor = this.radGridView1.ActiveEditor as RadDropDownListEditor;
  
            if (listEditor == null)
            {
                return;
            }
  
            RadDropDownListEditorElement editorElement = listEditor.EditorElement as RadDropDownListEditorElement;
            editorElement.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            editorElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown;
  
            var autocompleteStringCollection = new AutoCompleteStringCollection();
            foreach (var row in radGridView1.Rows)
            {
                var value = row.Cells["City"].Value;
                if (value != null)
                {
                    var valueString = value.ToString();
                    if (!autocompleteStringCollection.Contains(valueString))
                    {
                        autocompleteStringCollection.Add(valueString);
                    }
                }
            }
            textBoxItem = editorElement.TextBox.TextBoxItem;
            editorElement.DataSource = autocompleteStringCollection;
            editorElement.SelectedValue = this.radGridView1.CurrentCell.Value;
            editorElement.TextBox.TextBoxItem.TextChanging += new TextChangingEventHandler(TextBoxItem_TextChanging);
            editorElement.TextBox.TextBoxItem.KeyDown += new KeyEventHandler(TextBoxItem_KeyDown);
        }
  
  
        private void TextBoxItem_TextChanging(Object sender, TextChangingEventArgs e)
        {
            if (textBoxItem != null)
            {
                if (textBoxItem.Text.Length > 0)
                
                    editorText = textBoxItem.Text;
                }
            }
        }
  
        private void TextBoxItem_KeyDown(Object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.radGridView1.CurrentCell.Value = editorText;
                this.radGridView1.EndEdit();
            }
        }
  
    }
  
    class Person
    {
        public Person()
        { }
  
        public Person(int id, string name, string city)
        {
            this.Id = id;
            this.Name = name;
            this.City = city;
        }
  
        public int Id { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
    }
  
  
}

Regards,
Richard
0
Raymond
Top achievements
Rank 1
answered on 18 Jan 2011, 04:48 PM

This is better but not enough good to use it in my real application.

There are two problems:

  1. If you type something new in city cell (for existing row) and press enter text in cell is ok but if you again click on the same cell to change text after switching to edit mode text in cell is cleared.
  2. If I want add new row I fill Id, Name and City (I type something that is not on the list) but after adding row city in added row is empty.

Thanks for help – I was trying to figure out something but I failed.

0
Raymond
Top achievements
Rank 1
answered on 18 Jan 2011, 04:54 PM

It is very annoying that it is so difficult implement so simple feature using telerik control.

0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 18 Jan 2011, 05:05 PM
Hello,

This now seems to work for me. I'll also post a video in case I've missed anything. To be honest, there is likely to be an easier way that I have missed, but if it helps you, I'm happy to give it a go.
Richard

Designer File
namespace RadGridView_Basic_C
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components;
  
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
  
        #region Windows Form Designer generated code
  
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.radGridView1 = new Telerik.WinControls.UI.RadGridView();
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // radGridView1
            // 
            this.radGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.radGridView1.Location = new System.Drawing.Point(0, 0);
            this.radGridView1.Name = "radGridView1";
            this.radGridView1.Size = new System.Drawing.Size(457, 411);
            this.radGridView1.TabIndex = 0;
            this.radGridView1.Text = "radGridView1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(457, 411);
            this.Controls.Add(this.radGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit();
            this.ResumeLayout(false);
  
        }
  
        #endregion
  
        private Telerik.WinControls.UI.RadGridView radGridView1;
    }
}

Form 1
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;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI.Export;
using Telerik.WinControls.UI.Export.HTML;
using Telerik.WinControls.RadControlSpy;
  
  
namespace RadGridView_Basic_C
{
    public partial class Form1 : Form
    {
  
        private List<Person> m_myList = new List<Person>();
        List<String> cities = new List<string>();
        private String editorText = "";
        private RadTextBoxItem textBoxItem;
  
        public Form1()
        {
            InitializeComponent();
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
  
  
            this.radGridView1.AutoGenerateColumns = false;
            this.radGridView1.AllowAddNewRow = true;
            this.radGridView1.AllowEditRow = true;
  
            m_myList.Add(new Person(1, "Richard", "Bournemouth"));
            m_myList.Add(new Person(1, "Stew", "Christchurch"));
            m_myList.Add(new Person(1, "Chris", "Bearwood"));
            m_myList.Add(new Person(1, "Peter", "Southampton"));
            radGridView1.DataSource = m_myList;
  
  
            GridViewDecimalColumn idColumn = new GridViewDecimalColumn();
            idColumn.Name = "Id";
            idColumn.HeaderText = "Id";
            idColumn.FieldName = "Id";
            this.radGridView1.Columns.Add(idColumn);
  
            GridViewTextBoxColumn nameColumn = new GridViewTextBoxColumn();
            nameColumn.Name = "Name";
            nameColumn.HeaderText = "Name";
            nameColumn.FieldName = "Name";
            this.radGridView1.Columns.Add(nameColumn);
  
            GridViewComboBoxColumn cityColumn = new GridViewComboBoxColumn();
            cityColumn.Name = "City";
            cityColumn.HeaderText = "City";
            cityColumn.FieldName = "City";
            this.radGridView1.Columns.Add(cityColumn);
  
            this.radGridView1.CellEndEdit += new Telerik.WinControls.UI.GridViewCellEventHandler(this.radGridView1_CellEndEdit);
            this.radGridView1.CellEditorInitialized += new Telerik.WinControls.UI.GridViewCellEventHandler(this.radGridView1_CellEditorInitialized);
        }
  
  
        private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
        {
            RadDropDownListEditor listEditor = this.radGridView1.ActiveEditor as RadDropDownListEditor;
  
            if (listEditor == null)
            {
                return;
            }
  
            RadDropDownListEditorElement editorElement = listEditor.EditorElement as RadDropDownListEditorElement;
            editorElement.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            editorElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown;
  
            var autocompleteStringCollection = new AutoCompleteStringCollection();
            foreach (var row in radGridView1.Rows)
            {
                var value = row.Cells["City"].Value;
                if (value != null)
                {
                    var valueString = value.ToString();
                    if (!autocompleteStringCollection.Contains(valueString))
                    {
                        autocompleteStringCollection.Add(valueString);
                    }
                }
            }
            textBoxItem = editorElement.TextBox.TextBoxItem;
            editorElement.DataSource = autocompleteStringCollection;
            editorElement.SelectedValue = this.radGridView1.CurrentCell.Value;
            editorElement.TextBox.TextBoxItem.TextChanging += new TextChangingEventHandler(TextBoxItem_TextChanging);
        }
  
        private void radGridView1_CellEndEdit(object sender, GridViewCellEventArgs e)
        {
            if (editorText.Length > 0)
            
                 this.radGridView1.CurrentCell.Value = editorText;
                editorText = "";           
            }
        }
  
        private void TextBoxItem_TextChanging(Object sender, TextChangingEventArgs e)
        {
            if (textBoxItem != null)
            {
                if (textBoxItem.Text.Length > 0)
                
                    editorText = textBoxItem.Text;
                }
            }
  
  
    }
  
    class Person
    {
        public Person()
        { }
  
        public Person(int id, string name, string city)
        {
            this.Id = id;
            this.Name = name;
            this.City = city;
        }
  
        public int Id { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
    }
  }
  
}

Video to follow
Richard
0
Richard Slade
Top achievements
Rank 2
answered on 18 Jan 2011, 05:08 PM
And here is a Video
Richard
0
Raymond
Top achievements
Rank 1
answered on 19 Jan 2011, 08:44 AM
Now it is very good but I had to change a little you code.

I added this line in handler of CellEditorInitialized:

if (this.radGridView1.CurrentCell.Value != null)
{ editorElement.TextBox.TextBoxItem.Text = this.radGridView1.CurrentCell.Value.ToString(); }
else
{ editorElement.TextBox.TextBoxItem.Text = string.Empty; }

 and in your code there was missing handler for EditorRequired, probably you just forgot copy it.

There is only I think the last small issue.
Sometimes when I type something that starts from characters that match to items in the list I don`t see hint (list) with matching items. This is random I think. Do you see this problem also in you app?

I marked this as answer because it is almost perfect and you helped me a lot.

Regards

0
Richard Slade
Top achievements
Rank 2
answered on 19 Jan 2011, 10:05 AM
Hi Raymond,

Yes, I just missed out an event handler when I pasted this in I think. I'm really glad that this has helped you. To be honest, I've tried this now quite a few times and I haven't seen the autocomplete behavior not working. Perhaps it would be good to try it with an ordinary RadDropDown list to see if it does it there too.

If there's anything else, just let me know.
Thanks. All the best
Richard
0
Raymond
Top achievements
Rank 1
answered on 11 Feb 2011, 03:12 PM
Hello

I found new problem in DropDown style.

I cannot use arrows buttons left and right to move cursorL

Do you have any ideas?

Regards

0
Richard Slade
Top achievements
Rank 2
answered on 11 Feb 2011, 03:40 PM
Hi Raymond,

Hope you're well. I'm not quite sure what you mean. I have recorded a quick video based on the code that I gave you that you marked as answer above. As you can see, as I move between cells and up and down, I used the keyboard all the time.
The video can be found here
Regards,
Richard
0
Raymond
Top achievements
Rank 1
answered on 11 Feb 2011, 03:46 PM

Thanks I am fine, I hope you also.

Your video does not show my problem.

Let say that I have text: abcdefg

I want set text cursor (small vertical line) between ‘c’ and  ‘d’. I want do it using keyboard buttons: arrow left or arrow right.

Regards

0
Richard Slade
Top achievements
Rank 2
answered on 11 Feb 2011, 04:42 PM
Hi Raymond,

I see. I'll see if I can find a way to get that to work in the desired way.
regards,
Richard
0
Raymond
Top achievements
Rank 1
answered on 11 Feb 2011, 04:57 PM

It would be great if you found some fix.

I missed this problem and it is already in my application – QA found this bug during testing.

0
Richard Slade
Top achievements
Rank 2
answered on 11 Feb 2011, 05:09 PM
Hi Raymond,

I've just tried this on a normal situation GridViewComboBoxColumn set to
Telerik.WinControls.RadDropDownStyle.DropDown;
and it seems that this is the default and normal current behaviour. As I said though, I'll see if I can find a way to achieve what you need
Richard
0
Raymond
Top achievements
Rank 1
answered on 12 Feb 2011, 02:50 PM

I have checked sample from telerik demo:  DropDown&List -> DropDownList -> AutoComplete (example with countries).

In this example you can use keys arrow left and arrow right to move cursor without any problems.

I think current behavior for GridViewComboBoxColumn in DropDown/AutoComplete mode is not desired – in my opinion it is bug.

 Regards

0
Richard Slade
Top achievements
Rank 2
answered on 12 Feb 2011, 04:53 PM
Hi Raymond,

Yes, I see that it works as you'd expect if it's just a RadDropDownList. I'm not sure at the moment if how it is behaving in a GridViewComboBoxColumn is expected, but I tend to agree. It's not right that the left and right arrows don't work at all (they work as you'd expect in a GridViewTextBoxColumn. I'll keep looking. I'm sure this can't be too difficult but I haven't got there with it yet.
Richard
0
Accepted
Alexander
Telerik team
answered on 16 Feb 2011, 11:28 AM
Hello Raymond,

The RadDropDownListEditor behavior described by you is the intended one. This editor is usually used to select an option from a list and this navigation is convenient for this scenario.

You can accomplish your task by creating a custom editor as in the following code snippet:
private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
{
    if (e.EditorType == typeof(RadDropDownListEditor))
    {
        e.EditorType = typeof(CustomEditor);
    }
}
 
public class CustomEditor : RadDropDownListEditor
{
    public override void OnKeyDown(KeyEventArgs e)
    {
        if (!(e.KeyCode == Keys.Left || e.KeyCode == Keys.Right))
        {
            base.OnKeyDown(e);
        }
    }
 
    public override void OnKeyUp(KeyEventArgs e)
    {
        if (!(e.KeyCode == Keys.Left || e.KeyCode == Keys.Right))
        {
            base.OnKeyDown(e);
        }
    }
}

I hope it helps.

Best regards,
Alexander
the Telerik team
Q3’10 SP1 of RadControls for WinForms is available for download; also available is the Q1'11 Roadmap for Telerik Windows Forms controls.
0
Raymond
Top achievements
Rank 1
answered on 17 Feb 2011, 08:06 PM
works perfect
thanks a lot
Tags
GridView
Asked by
Raymond
Top achievements
Rank 1
Answers by
Richard Slade
Top achievements
Rank 2
Raymond
Top achievements
Rank 1
Alexander
Telerik team
Share this question
or