Here is the code I am using:
Dim currentCell = RemindersGridView.Rows(RemindersGridView.Rows.Count - 1).Cells(2) currentCell.RowInfo.IsCurrent = True currentCell.ColumnInfo.IsCurrent = True currentCell.BeginEdit() It does not work under these circumstances:
1) The second time the code is called.
I have the code in an Add button, so when the user clicks Add to add a new row, the 3rd cell is automatically opened for edit. This works the first time I click the Add button. But if I press it a second time, it does not work. I tried to call EndEdit before this code, and that did not help.
2) If the cell is a drop down list.
If the cell to automatically open for edit is a drop down list, the code does not work. It does not show the comboBox editor.
Any tips for fixing either of these issues is appreciated!
thanks!
17 Answers, 1 is accepted
Please try something like this: (if you have any problems please uncomment those lines, the first one should be in the case of multiselection to prevent multiple cells from being selected, and the second one is because the grids virtualization mechanism to force all pending async operations to be performed)
//radGridView1.ClearSelection();var currentCell = radGridView1.Rows[radGridView1.Rows.Count - 1].Cells[2];currentCell.IsSelected = true;currentCell.BeginEdit();//radGridView1.RootElement.PerformLayout();var dropDownEditor = radGridView1.ActiveEditor as RadDropDownListEditor;if (dropDownEditor != null){ var element = dropDownEditor.EditorElement as RadDropDownListEditorElement; element.ShowPopup();}Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Looks like Emanuel has addressed the drop down here. I've just tried this. Almost the same as your code...
Private Sub RadButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadButton1.Click Dim currentCell As GridViewCellInfo = Me.RadGridView.Rows(2).Cells(1) currentCell.ColumnInfo.IsCurrent = True currentCell.RowInfo.IsCurrent = True currentCell.IsSelected = True currentCell.RowInfo.IsSelected = True currentCell.BeginEdit() End Suband from the button click it always works the second time around too. Perhaps in your case the endEdit is not being called correctly. You can always call EndEdit() before begin edit to see if that's the case.
Hope that helps also.
Richard..
//Off Topic - Emanuel - congratulations on your MVP status. Totally deserved. - Richard
You don't need these lines:
currentCell.ColumnInfo.IsCurrent = TruecurrentCell.RowInfo.IsCurrent = TruecurrentCell.RowInfo.IsSelected = TrueWhat I've posted earlier is working by itself, because you when you say BeginEdit() you are starting an edit operation on the CurrentCell, not on the selected row, and not on the selected column....
Best Regards,
Emanuel Varga
It's true, but I put them in to replicate what Deborah had done.
Thanks
Richard
RemindersGridView.ClearSelection() Dim currentCell = RemindersGridView.Rows(RemindersGridView.Rows.Count - 1).Cells(2) currentCell.IsSelected = True currentCell.BeginEdit() RemindersGridView.RootElement.PerformLayout() Dim dropDownEditor = DirectCast(RemindersGridView.ActiveEditor, RadDropDownListEditor) If dropDownEditor IsNot Nothing Then Dim element = DirectCast(dropDownEditor.EditorElement, RadDropDownListEditorElement) element.ShowPopup() End IfWhen I break on the If statement, the ActiveEditor is nothing. I am also NOT getting a CellBeginEdit event after executing the BeginEdit statement.
As I mentioned earlier, this is in an Add button click event. Is it possible that yours works and mine does not because I am adding the row to the underlying datasource in the same method?
Here is the entire click event:
Private Sub AddButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click ' Create the new reminder item Dim ReminderListItem As Reminder = Reminder.Create ' Add the new item to the bound list Me.ReminderList.Add(ReminderListItem) ' Select the added row and the text cell RemindersGridView.ClearSelection() Dim currentCell = RemindersGridView.Rows(RemindersGridView.Rows.Count - 1).Cells(2) currentCell.IsSelected = True currentCell.BeginEdit() RemindersGridView.RootElement.PerformLayout() Dim dropDownEditor = DirectCast(RemindersGridView.ActiveEditor, RadDropDownListEditor) If dropDownEditor IsNot Nothing Then Dim element = DirectCast(dropDownEditor.EditorElement, RadDropDownListEditorElement) element.ShowPopup() End If End SubAny other ideas?
The code i've posted earlier is fired from a button click, please take a look at this example and tell me if this is working for you, and then we'll continue from there:
using System;using System.ComponentModel;using System.Windows.Forms;using Telerik.WinControls.UI;public partial class Form1 : Form{ private RadGridView radGridView1; public Form1() { InitializeComponent(); this.Controls.Add(radGridView1 = new RadGridView()); this.radGridView1.DataBindingComplete += new GridViewBindingCompleteEventHandler(radGridView1_DataBindingComplete); radGridView1.Dock = DockStyle.Fill; radGridView1.MultiSelect = true; var button = new RadButton(); button.Text = "Click me"; button.Dock = DockStyle.Bottom; button.Click += new EventHandler(button_Click); this.Controls.Add(button); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.DataSource = new ProductsCollection(1000); } void button_Click(object sender, EventArgs e) { //radGridView1.ClearSelection(); var currentCell = radGridView1.Rows[radGridView1.Rows.Count - 1].Cells[2]; currentCell.IsSelected = true; currentCell.BeginEdit(); //radGridView1.RootElement.PerformLayout(); var dropDownEditor = radGridView1.ActiveEditor as RadDropDownListEditor; if (dropDownEditor != null) { var element = dropDownEditor.EditorElement as RadDropDownListEditorElement; element.ShowPopup(); } } void radGridView1_DataBindingComplete(object sender, GridViewBindingCompleteEventArgs e) { radGridView1.Columns["BuyerId"].IsVisible = false; var column = new GridViewComboBoxColumn("SomeComboboxColumn", "SomeComboboxColumn"); column.DataSource = new BuyersCollection(10, 10); column.ValueMember = "Id"; column.FieldName = "BuyerId"; column.DisplayMember = "Name"; this.radGridView1.Columns.Add(column); this.radGridView1.BestFitColumns(); }}#region Helperspublic class Product : INotifyPropertyChanged{ private int id, buyerId; public int BuyerId { get { return buyerId; } set { buyerId = value; OnPropertyChanged("BuyerId"); } } public int Id { get { return id; } set { id = value; OnPropertyChanged("Id"); } } public Product(int id, int buyerId) { this.Id = id; this.BuyerId = buyerId; } private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged;}public class Buyer{ public int Id { get; set; } public string Name { get; set; } public Buyer(int id, string name) { this.Id = id; this.Name = name; }}public class ProductsCollection : BindingList<Product>{ public ProductsCollection(int noItems) { for (int i = 0; i < noItems; i++) { this.Add(new Product(i, i + 10)); } }}public class BuyersCollection : BindingList<Buyer>{ public BuyersCollection(int startIndex, int lenght) { for (int i = 0; i < 10; i++) { this.Add(new Buyer(i + 10, "Buyer" + (i + 1))); } }}#endregion HelpersI think that the issue comes from trying to add a new row and also begin edit at the same time. I was able to replicate your issue of not being able to edit on the second time. I managed to solve this by calling BeginUpdate and endUpdate on the RadGridView.
See the example below.
Imports Telerik.WinControls.UI Public Class Form1 Private Sub RadButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadButton1.Click RadGridView1.BeginUpdate() Dim rowInfo As GridViewRowInfo = Me.RadGridView1.Rows.AddNew() rowInfo.Cells(0).Value = "New1" rowInfo.Cells(1).Value = "New2" RadGridView1.ClearSelection() RadGridView1.EndUpdate() Dim currentCell As GridViewCellInfo = RadGridView1.Rows(RadGridView1.Rows.Count - 1).Cells(1) currentCell.IsSelected = True currentCell.BeginEdit() End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.RadGridView1.Columns.Add(New GridViewTextBoxColumn("A")) Me.RadGridView1.Columns.Add(New GridViewTextBoxColumn("B")) Dim rowInfo As GridViewRowInfo = Me.RadGridView1.Rows.AddNew() rowInfo.Cells(0).Value = "A1" rowInfo.Cells(1).Value = "B1" rowInfo = Me.RadGridView1.Rows.AddNew() rowInfo.Cells("A").Value = "A2" rowInfo.Cells("B").Value = "B2" End SubEnd ClassTaking away the lines..
RadGridView1.BeginUpdate() ... RadGridView1.EndUpdate() Let me know if that helps
Richard
Note from my original post that the code I posted *does* work when I click the Add button if the column is a Textbox AND it is the first time that I click. It just does not work a second time. Nor does it work with a combobox. NOTE: I am using a Combox and not a DropDownList because DropDownlist is not a choice in the designer and this grid was created with the designer. Could that be the problem?
I wondered if I need to somehow end the prior edit?
Or if I need to use a different event because the new row was not finished generating when I just added it to the underlying list?
Thanks -
Have you tried the BeginUpdate() and EndUpdate() as I suggested?
Richard
Thank you! Thank you! Thank you!
I posted my prior message before I received your reply. Using BeginUpdate and EndUpdate worked. I had tried it before, but not around the code I was using to add the row.
For anyone else with this problem note that this ALSO fixed the problem with the combobox.
Just one more question if I may ... what is BeginUpdate and EndUpdate doing exactly?
Thanks again!
Glad that this has worked for you. Please remember to mark as answer so others can find the solution too.
BeginUpdate prepares the grid for certain operations to take place and is also used to enhance performance.
Best regards,
Richard
Richard
This seems to be one of the few WinForms threads on the topic of activating the drop down by just clicking once into a cell. I've modified the accepted answer a bit to fire during the cell's click event. The accepted answer works but actually then causes all other columns to activate the edit mode upon a cell's click. I also shortened the lines of code up using C#'s new null propagation operator.
private void Dg_CellClick(object sender, GridViewCellEventArgs e){ if (dg.Columns[e.ColumnIndex] is GridViewComboBoxColumn) { var currentCell = dg.Rows[e.RowIndex].Cells[e.ColumnIndex]; currentCell.BeginEdit(); var dropDownEditor = dgSamples.ActiveEditor as RadDropDownListEditor; var editorElement = dropDownEditor?.EditorElement as RadDropDownListEditorElement; editorElement?.ShowPopup(); }}Thank you for sharing your solution.
Indeed, this is a valid approach for opening up the drop down.
Please let me know if you need additional assistance.
Regards,
Hristo Merdjanov
Telerik
Hello all...
How to make this happen when i called it from another form
Dim currentCell As GridViewCellInfo = RadGridView1.Rows(RadGridView1.Rows.Count - 1).Cells(1)
currentCell.IsSelected = True
currentCell.BeginEdit()
This the code i wrote for fill raggridview form another form, i need to edit mode cell 2.
Dim frm = Application.OpenForms("FrmBeli")
If frm IsNot Nothing Then
If GridCari.CurrentRow.Index <> -1 Then
i = GridCari.CurrentRow.Index
CType(frm, FrmBeli).GridDetail.ClearSelection()
CType(frm, FrmBeli).GridDetail.Rows.Add(GridCari.Rows(i).Cells(0).Value.ToString(), GridCari.Rows(i).Cells(1).Value.ToString())
CType(frm, FrmBeli).GridDetail.BeginEdit()
End If
End If
Thanks before
Thank you for writing.
As long as you can access the form with the grid from the other form you should not have issues with setting a particular cell in EditMode. For example, you can expose a public method in the grid form and pass as parameters the row and column indices of the cell you want to select. Then you can call the RadGridView.BeginEdit method.
In case you need further assistance please provide me with more details about your actual scenario.
I hope this helps. Let me know if you need further assistance.
Regards,
Hristo
Progress Telerik
