I am currently trying to create controls inside a column of the grid view dynamically. My requirement is like i want to create textbox or combo box and bind it into the column depending on the condition. Is it possible to have textbox and combobox in the same column?
Can you please enlighten us with some sample code?
Thanks in advance,
Veda
31 Answers, 1 is accepted
Thank you for the question.
You could customize every cell in RadGridView through the CellFormating and ViewCellFormating events.
To add RadComboBoxElement in data cells you can use CellFormating. Please, review the code-block below as example:
void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e) |
{ |
if (e.CellElement.ColumnIndex == 0 && |
(float)this.radGridView1.Rows[e.CellElement.RowIndex].Cells["Discount"].Value == 0) |
{ |
e.CellElement.Children.Add(new RadComboBoxElement()); |
} |
} |
You can find more information on these in the provided documentation.
Do not hesitate to contact me again if you have other questions.
Best wishes,
Martin Vasilev
the Telerik team
Check out Telerik Trainer, the state of the art learning tool for Telerik products.
How do you add items to the RadComboBoxElement?
Thank you writing.
You can add items to the RadComboBoxEditor in the EditorRequiered event. Please, review the code block below as example:
void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e) |
{ |
RadComboBoxEditor comboEditor = e.Editor as RadComboBoxEditor; |
if (comboEditor != null) |
{ |
comboEditor.Items.Clear(); |
for (int i = 0; i < (int)this.radGridView1.CurrentRow.Cells[2].Value; i++) |
{ |
comboEditor.Items.Add(new RadComboBoxItem(String.Format("item{0}", i+1))); |
} |
comboEditor.SelectedIndex = 0; |
} |
} |
Hope this helps. Write me back if you have other questions.
Kind regards,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
this is my code to set in the first row comboboxes
private void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e) |
{ |
if (e.CellElement.ColumnInfo is GridViewDataColumn && !(e.CellElement.RowElement is GridTableHeaderRowElement)) |
{ |
if (e.CellElement.RowIndex == 0) |
{ |
if (e.CellElement.Children.Count > 0) |
return; |
RadComboBoxEditor element = new RadComboBoxEditor(); |
element.Items.Add(new RadComboBoxItem("test")); |
element.Items.Add(new RadComboBoxItem("test")); |
element.Items.Add(new RadComboBoxItem("test")); |
element.Items.Add(new RadComboBoxItem("test")); |
element.Items.Add(new RadComboBoxItem("test")); |
e.CellElement.Children.Add(element); |
// apply theme to the progress bar |
ApplyThemeToElement(element, "ControlDefault"); |
} |
} |
} |
private void ApplyThemeToElement(RadItem item, string themeName) |
{ |
DefaultStyleBuilder builder = |
ThemeResolutionService.GetStyleSheetBuilder(item, themeName) as DefaultStyleBuilder; |
if (builder != null) |
//clone because control might modify it later |
item.Style = new XmlStyleSheet(builder.Style).GetStyleSheet(); |
} |
So I added this code:
private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e) |
{ |
RadComboBoxEditor comboEditor = e.Editor as RadComboBoxEditor; |
string t = e.EditorType.ToString(); |
if (comboEditor != null) |
{ |
comboEditor.Items.Clear(); |
for (int i = 0; i < (int)this.radGridView1.CurrentRow.Cells[2].Value; i++) |
{ |
comboEditor.Items.Add(new RadComboBoxItem(String.Format("item{0}", i + 1))); |
} |
comboEditor.SelectedIndex = 0; |
} |
} |
I'm still having the problem. the strangest thing is when I right click on the combobox. The list is being opened. So that works fine. But when I use the left click. The focus goed to the textbox at the back of the combobox.
When I type I can see that the focus is on the textbox. Is there a way to solve this?
I've allready tried
e.CellElement.CanFocus =
false;
but with no success...
Thank you for contacting me again.
After a couple of tests I have to admit that there is not an easy way to create different cells for one column. The main difficulty comes from the fact that you have to implement a custom editor, and change it depending on the cell type. The standard editor for GridViewDataColumn is a text editor, and the EditorRequired event does not work there. Unfortunately, implementing custom editor is a very hard task and I cannot recommend it. We will consider adding such of functionality in some of the future releases.
Write me back if you have other questions.
Kind regards,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
Thank you for the question. Actually, with the new version Q2 2009, I have managed to implement different type of cell elements in one column. I have prepared a simple scenario that changes grid's cells to ComboBoxes for every even row in a custom GridViewTextBoxColumn. Please, find the example project as attachment to this message.
Write me back if you have any other questions.
All the best,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
This code is very usefull for me. I am looking for the sample and help I could not find anything related to date mask in the grid. Could you please update this example so that user can enter the formated Date (MM/dd/yy) in the masked edit kind of editor along with the lookup and plain text.
Thanks
Dipak
Thank you for getting back to me. It occurred to me a way to implement a similar scenario. Since in the latest version changing the editor for chosen cell become very easy, you can just change it to RadDateTimePickerEditor for the selected cells. You also could make a custom editor that matches exactly your needs. Please, consider the following code:
void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e) |
{ |
if (this.radGridView1.Columns[2].IsCurrent && (int)this.radGridView1.CurrentRow.Cells[0].Value % 2 == 0) |
{ |
e.EditorType = typeof(RadDateTimeEditor); |
} |
} |
Write me back if you need additional assistance.
Regards,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
Thanks this works fine for me. Now I can edit DateValue in DateTimeEditor. I have one formating problem. I am showing the Date in the grid in MM/dd/yyyy format. Once I edit this date and close the editor it will update the Date along with the time. I dont want the time portion here.Same thing happens when I am adding new date in this it is also showing Date and Time.
Could you please help me to format when it transfers from editor to grid cell ?
Thanks
Dipak
Thank you for writing again. RadGridView does not support different formatting for the cells in one and the same column. Nevertheless, you can work-around this by changing cell element text in the CellFormattingEvent. Please, consider the following code:
void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e) |
{ |
if (e.CellElement.RowInfo is GridViewDataRowInfo && e.CellElement.ColumnIndex == 2) |
{ |
DateTime date; |
if (DateTime.TryParse(e.CellElement.RowInfo.Cells[2].Value.ToString(), out date)) |
{ |
e.CellElement.Text = date.ToString("d MMMM yyyy"); |
} |
} |
} |
Best wishes,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
As I understand - it can be done by catching CellFormatting event and proceed by e.CellElement.Children collection, add here a RadComboBoxElement or RadDateTimeEditorElement (is it?).
Questions:
1. What kind of base column type must I set?
2. Must I previously remove element from e.CellElement.Children collection (in order change cell type from combobox to datetime, for example)?
3. How often CellFormatting event is firing? Can I be sure that changing combobox value in other "ruler" column will start this event?
I am not very familiar with C#, would it be possible obtain some examples in VB.Net?
I use Telerik RadControls for WinForms v2009.2.729.
Thank you for writing.
You are right, you can dynamically change the cell elements in CellFormatting event through CellElement.Children collection.
1. You can use any column type depending on your scenario. For instance, when I tested it, I used GridViewTextBoxColumn.
2. Since you want to swap elements between the ComboBox and the DateTimePicker, you have to clear the Children collection before adding the appropriate element.
3. CellFormatting event fires on every state change e.g. scrolling, filtering, sorting, etc. In most cases, it is enough to handle every situation including the described.
Please, consider the following code-block as an example for a similar scenario:
Private
Sub
radGridView1_CellBeginEdit(
ByVal
sender
As
Object
,
ByVal
e
As
GridViewCellCancelEventArgs)
If
e.ColumnIndex = 2
Then
e.Cancel =
True
End
If
End
Sub
Private
Sub
radGridView1_CellFormatting(
ByVal
sender
As
Object
,
ByVal
e
As
CellFormattingEventArgs)
If
TypeOf
e.CellElement.RowInfo
Is
GridViewDataRowInfo
Then
Dim
conditionValue
As
Object
= e.CellElement.RowInfo.Cells(
"id"
).Value
Dim
currentValue
As
Object
=
DirectCast
(e.CellElement, GridDataCellElement).Value
If
e.CellElement.ColumnIndex = 2
Then
If
CInt
(conditionValue)
Mod
4 = 0
Then
Dim
datePicker
As
RadDateTimeEditorElement =
Nothing
If
e.CellElement.Children.Count = 0
OrElse
Not
(
TypeOf
e.CellElement.Children(0)
Is
RadDateTimeEditorElement)
Then
e.CellElement.Children.Clear()
datePicker =
New
RadDateTimeEditorElement()
AddHandler
datePicker.ValueChanged,
AddressOf
datePicker_ValueChanged
e.CellElement.Children.Add(datePicker)
ElseIf
TypeOf
e.CellElement.Children(0)
Is
RadDateTimeEditorElement
Then
datePicker =
DirectCast
(e.CellElement.Children(0), RadDateTimeEditorElement)
End
If
Dim
d
As
DateTime
If
datePicker IsNot
Nothing
AndAlso
currentValue IsNot
Nothing
AndAlso
DateTime.TryParse(currentValue.ToString(), d)
Then
Me
.settingValue =
True
datePicker.Value = Convert.ToDateTime(currentValue)
Me
.settingValue =
False
End
If
Else
Dim
combo
As
RadComboBoxElement =
Nothing
If
e.CellElement.Children.Count = 0
OrElse
Not
(
TypeOf
e.CellElement.Children(0)
Is
RadComboBoxElement)
Then
e.CellElement.Children.Clear()
combo =
New
RadComboBoxElement()
combo.ForeColor = Color.Black
AddHandler
combo.SelectedIndexChanged,
AddressOf
combo_SelectedIndexChanged
For
i
As
Integer
= 0
To
4
combo.Items.Add(
New
RadComboBoxItem([
String
].Format(
"Value{0}"
, i + 1)))
Next
e.CellElement.Children.Add(combo)
ElseIf
TypeOf
e.CellElement.Children(0)
Is
RadComboBoxElement
Then
combo =
DirectCast
(e.CellElement.Children(0), RadComboBoxElement)
End
If
If
combo IsNot
Nothing
Then
Me
.settingValue =
True
If
currentValue IsNot
Nothing
AndAlso
currentValue <> DBNull.Value
Then
combo.SelectedIndex = Convert.ToInt32(currentValue)
Else
combo.SelectedIndex = -1
End
If
Me
.settingValue =
False
End
If
End
If
ElseIf
e.CellElement.Children.Count > 0
AndAlso
TypeOf
e.CellElement.Children(0)
Is
RadComboBoxElement
Then
e.CellElement.Children.Clear()
End
If
End
If
End
Sub
Private
Sub
datePicker_ValueChanged(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
If
Not
Me
.settingValue
AndAlso
Me
.radGridView1.CurrentCell IsNot
Nothing
Then
Dim
datePicker
As
RadDateTimeEditorElement =
DirectCast
(sender, RadDateTimeEditorElement)
Me
.radGridView1.CurrentCell.Value = datePicker.Value
End
If
End
Sub
Private
Sub
combo_SelectedIndexChanged(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
If
Not
Me
.settingValue
AndAlso
Me
.radGridView1.CurrentCell IsNot
Nothing
Then
Dim
combo
As
RadComboBoxElement =
DirectCast
(sender, RadComboBoxElement)
Me
.radGridView1.CurrentCell.Value = combo.SelectedIndex
End
If
End
Sub
Do not hesitate to contact me again if you have any other questions.
Greetings,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Are you canceling going into edit mode for that column and in those rows because you have replaced the textbox with a control that is different than other types of edit controls in normally appear in that column? The code sample wasn't commented and I have a similar situation where I'm replacing the textbox with a combobox that is different in the last column and based on the information entered in the previous column. Thanks for any insight!
Thank you for the question.
I have canceled the BeginEdit event because I have substituted cell elements with my own elements (RadDateTimeEditorElement or RadComboBoxElement). In this way, I do not need to enter in edit mode and initialize the default column editor, because it is going to mess up with the new elements. I just use the elements' events to manage the change of the value and to save the cell value.
I hope this makes the things clearer. Write me back if you need additonal assistance.
Kind regards,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Thank you for the question. You can use EditorRequierd event to change the cell editor based on a condition. Please, refer to our documentation for a detailed description on how to do that. Let me know if you have any additional questions.
Greetings,
Martin Vasilev
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items.
There is grid with two column (type of GridViewComboBoxColumn). First column has DataSource like "Combo1", "Combo2" and "Date". First and second values must populate second cell with different Datasource, and third value must populate second cell with DateTime value.
Here is example code (I presume that it's not so smart code, sorry for that):
Public
Class
RadForm1
Dim
Condit
As
System.Collections.ArrayList
Dim
CbValue1
As
System.Collections.ArrayList
Dim
CbValue2
As
System.Collections.ArrayList
Private
Sub
RadForm1_Load(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Handles
MyBase
.Load
Condit =
New
System.Collections.ArrayList
Condit.Add(
"Combo1"
)
Condit.Add(
"Combo2"
)
Condit.Add(
"Date"
)
CbValue1 =
New
System.Collections.ArrayList
CbValue1.Add(
"C1_1"
)
CbValue1.Add(
"C1_2"
)
CbValue2 =
New
System.Collections.ArrayList
CbValue2.Add(
"C2_1"
)
CbValue2.Add(
"C2_2"
)
Dim
column
As
Telerik.WinControls.UI.GridViewComboBoxColumn
column = gridLogic.Columns(0)
column.DataType =
GetType
(
String
)
column.DataSource = Condit
column = gridLogic.Columns(1)
column.DataType =
GetType
(
String
)
column.DataSource = CbValue1
gridLogic.Rows.AddNew()
gridLogic.Rows(0).Cells(0).Value =
"Combo1"
gridLogic.Rows(0).Cells(1).Value =
"C1_1"
gridLogic.Rows.AddNew()
gridLogic.Rows(1).Cells(0).Value =
"Combo1"
gridLogic.Rows(1).Cells(1).Value =
"C1_2"
gridLogic.Rows.AddNew()
gridLogic.Rows(2).Cells(0).Value =
"Combo1"
gridLogic.Rows(2).Cells(1).Value =
"C1_1"
End
Sub
Private
Sub
gridLogic_CellBeginEdit(
ByVal
sender
As
Object
,
ByVal
e
As
Telerik.WinControls.UI.GridViewCellCancelEventArgs)
Handles
gridLogic.CellBeginEdit
Dim
NumRow
As
Integer
= gridLogic.Rows.IndexOf(gridLogic.CurrentRow)
If
gridLogic.Columns(1).IsCurrent
AndAlso
gridLogic.Rows(NumRow).Cells(0).Value =
"Date"
Then
If
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Count = 0
Then
Dim
dtel
As
New
Telerik.WinControls.UI.RadDateTimeEditorElement
AddHandler
dtel.ValueChanged,
AddressOf
gridlogic_DateTime_ValueChanged
dtel.Tag = NumRow
dtel.Value = Now
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Add(dtel)
e.Cancel =
True
Else
e.Cancel =
True
End
If
End
If
If
gridLogic.Columns(0).IsCurrent
Then
Dim
editor
As
Telerik.WinControls.UI.IInputEditor =
Me
.gridLogic.ActiveEditor
If
TypeOf
(editor)
Is
Telerik.WinControls.UI.RadDropDownListEditor
Then
Dim
comboElement
As
Telerik.WinControls.UI.RadDropDownListEditorElement =
CType
(
CType
(editor, Telerik.WinControls.UI.RadDropDownListEditor).EditorElement, Telerik.WinControls.UI.RadDropDownListEditorElement)
AddHandler
(comboElement.SelectedIndexChanged),
AddressOf
gridlogic_Condition_SelectedIndexChanged
End
If
End
If
End
Sub
Private
Sub
gridlogic_Condition_SelectedIndexChanged(
ByVal
sender
As
System.
Object
,
ByVal
e
As
EventArgs)
Dim
NumRow
As
Integer
= gridLogic.Rows.IndexOf(gridLogic.CurrentRow)
Dim
NumCol
As
Integer
= gridLogic.Columns.IndexOf(gridLogic.CurrentColumn)
If
CType
(sender, Telerik.WinControls.UI.RadDropDownListEditorElement).SelectedIndex < 0
Then
Exit
Sub
Dim
item
As
String
=
CType
(sender, Telerik.WinControls.UI.RadDropDownListEditorElement).SelectedItem.Value
If
item =
"Combo1"
Then
If
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Count > 0
Then
If
Not
TypeOf
gridLogic.Rows(NumRow).Cells(1).CellElement.Children(0)
Is
Telerik.WinControls.UI.RadDropDownListEditorElement
Then
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Remove(gridLogic.Rows(NumRow).Cells(1).CellElement.Children(0))
End
If
End
If
gridLogic.Rows(NumRow).Cells(1).Value =
"C1_1"
End
If
If
item =
"Combo2"
Then
If
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Count > 0
Then
If
Not
TypeOf
gridLogic.Rows(NumRow).Cells(1).CellElement.Children(0)
Is
Telerik.WinControls.UI.RadDropDownListEditorElement
Then
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Remove(gridLogic.Rows(NumRow).Cells(1).CellElement.Children(0))
End
If
End
If
gridLogic.Rows(NumRow).Cells(1).Value =
"C2_1"
End
If
If
item =
"Date"
Then
If
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Count = 0
Then
Dim
dtel
As
New
Telerik.WinControls.UI.RadDateTimeEditorElement
AddHandler
dtel.ValueChanged,
AddressOf
gridlogic_DateTime_ValueChanged
dtel.Tag = NumRow
Try
dtel.Value = Now
Catch
ex
As
Exception
End
Try
gridLogic.Rows(NumRow).Cells(1).CellElement.Children.Add(dtel)
End
If
End
If
End
Sub
Private
Sub
gridlogic_DateTime_ValueChanged(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Dim
dt
As
Telerik.WinControls.UI.RadDateTimeEditorElement =
CType
(sender, Telerik.WinControls.UI.RadDateTimeEditorElement)
gridLogic.Rows(dt.Tag).Cells(1).Value = dt.Value
End
Sub
Private
Sub
gridLogic_CellEndEdit(
ByVal
sender
As
Object
,
ByVal
e
As
Telerik.WinControls.UI.GridViewCellEventArgs)
Handles
gridLogic.CellEndEdit
If
gridLogic.Columns(0).IsCurrent
Then
Dim
editor
As
Telerik.WinControls.UI.IInputEditor =
Me
.gridLogic.ActiveEditor
If
TypeOf
(editor)
Is
Telerik.WinControls.UI.RadDropDownListEditor
Then
Dim
comboElement
As
Telerik.WinControls.UI.RadDropDownListEditorElement =
CType
(
CType
(editor, Telerik.WinControls.UI.RadDropDownListEditor).EditorElement, Telerik.WinControls.UI.RadDropDownListEditorElement)
RemoveHandler
(comboElement.SelectedIndexChanged),
AddressOf
gridlogic_Condition_SelectedIndexChanged
End
If
End
If
End
Sub
Private
Sub
gridLogic_CellEditorInitialized(
ByVal
sender
As
Object
,
ByVal
e
As
Telerik.WinControls.UI.GridViewCellEventArgs)
Handles
gridLogic.CellEditorInitialized
If
gridLogic.Columns(1).IsCurrent
Then
If
gridLogic.CurrentRow.Cells(0).Value =
"Combo1"
Or
gridLogic.CurrentRow.Cells(0).Value =
"Combo2"
Then
Dim
NumRow
As
Integer
= gridLogic.Rows.IndexOf(gridLogic.CurrentRow)
Dim
editor
As
Telerik.WinControls.UI.RadDropDownListEditor = gridLogic.ActiveEditor
Dim
editorElement
As
Telerik.WinControls.UI.RadDropDownListEditorElement = editor.EditorElement
If
gridLogic.CurrentRow.Cells(0).Value =
"Combo1"
Then
editorElement.DataSource = CbValue1
editorElement.SelectedText =
"C1_1"
End
If
If
gridLogic.CurrentRow.Cells(0).Value =
"Combo2"
Then
editorElement.DataSource = CbValue2
editorElement.SelectedText =
"C2_1"
End
If
End
If
End
If
End
Sub
End
Class
It works fine but I upgrade to latest version 2011.3.11.1219.
I've changed RadComboBoxEditor to RadDropDownListEditor, and RadComboBoxEditorElement to RadDropDownListEditorElement. But I can not obtain CellElement from specific cell to change editor (from DropDownList to DateTimeEditor, or remove DateTimeEditor).
How can I change code? Is here some simplier way to obtain result (described above)?
It is not recommend to use the cell element outside the CellFormatting event because of the UI virtualization of RadGridView. I recommend using the EditorRequired event where you can replace the default editor with the one that you want. I am enclosing a sample project which demonstrates how you can do it.
Greetings,Svett
the Telerik team
But this event fires only if I click on that cell - here I can change editor, populate Datasource property for combobox, set cell's value, etc.
But how can I change this editor before clicking on that cell? I mean, I change value in first column from "Combo" to "Date" and want to reflect that change immediatelly - value in second column must be set to appropriate (some date, probably stored in my value's array). Otherwise, if I change value in first column from "Date" to "Combo" - value in second column must be set to appropriate (some value from list in accordance with Datasource array linked with that combobox).
If I change value in second column's cell by catching CellValueChanged event from first column's cell - it can produce error because type of second column's cell would not be affordable for that new value.
I presume that I miss something.
First of all, if you are changing the editor dynamically, the underlying data source of the RadGridView should support the data types for all editors of the column that may appear. That means, if you have spin editor and date time picker, the underline field should be of the type that can host both values. I recommend using an object type for the field where you have dynamic editors.
By following your illustration, I concluded that you have two active editors which is impossible. I am not able to assist you efficiently by following the given information. Could you please open a support ticket where you can enclose a project which demonstrates your approach? In addition, give us the exact steps that we should follow to reproduce the error that you have experienced. This will allow us to assist you further.
Greetings,
Svett
the Telerik team
I have a grid that I have bound my columns to a datareader. I have 2 columns that I look at in this grid when wanting to make a custom combobox for a cell and they are "Batch Status" and "Status ID" and they are both textbox cell types. For the column "Batch Status" I want to make it a combobox for certain cells if the "Batch Status" is "Open".
To start out I create a list array of all my combobox items.
Private mstrBatchStatusList As New List(Of ComboBoxDataSourceObject)()
Then I go ahead and use CellFormatting to make the cell a combobox if the Batch Status is "Open".
Private Sub rgvBatch_CellBeginEdit(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.GridViewCellCancelEventArgs) Handles rgvBatch.CellBeginEdit
'
' Got this from a website. http://www.telerik.com/forums/dynamically-adding-controls-in-the-columns-in-the-grid
' The status column is a canceled Edit because I have substituted cell elements with my own elements
' (RadDropDownListEditorElement). In this way, I do not need to enter in edit mode and initialize the
' default column editor, because it is going to mess up with the new elements. I just use the elements'
' events to manage the change of the value and to save the cell value.
'
If e.Column.HeaderText = "Status" Then
e.Cancel = True
End If
End Sub
Private Sub rgvBatch_CellFormatting(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.CellFormattingEventArgs) Handles rgvBatch.CellFormatting
'
' Edit
'
If e.CellElement.ColumnInfo.HeaderText = "Edit" Then
'This is how we get the RadButtonElement instance from the cell
Dim button As RadButtonElement = CType(e.CellElement.Children(0), RadButtonElement)
If e.CellElement.RowInfo.Cells("Batch_Status").Value IsNot Nothing Then
Dim title As String = e.CellElement.RowInfo.Cells("Batch_Status").Value.ToString()
If title = "Deleted" Then
button.Enabled = False
Else
button.Enabled = True
End If
End If
End If
'
' Delete
'
If e.CellElement.ColumnInfo.HeaderText = "Delete" Then
'This is how we get the RadButtonElement instance from the cell
Dim button As RadButtonElement = CType(e.CellElement.Children(0), RadButtonElement)
If e.CellElement.RowInfo.Cells("Batch_Status").Value IsNot Nothing Then
Dim title As String = e.CellElement.RowInfo.Cells("Batch_Status").Value.ToString()
If title <> "Open" Or mblnReadOnly Then
button.Enabled = False
Else
button.Enabled = True
End If
End If
End If
'
' Status
'
If TypeOf e.CellElement.RowInfo Is GridViewDataRowInfo Then
If e.CellElement.ColumnInfo.HeaderText = "Status" Then
If e.CellElement.RowInfo.Cells("Batch_Status").Value IsNot Nothing Then
Dim strBatchStatus As String = e.CellElement.RowInfo.Cells("Batch_Status").Value.ToString()
Dim currentStatusID As Object = e.CellElement.RowInfo.Cells("AccPac_Batch_Status_ID").Value.ToString()
If strBatchStatus = "Open" And Not mblnReadOnly Then
Dim gvDropDownList As RadDropDownListEditorElement = Nothing
If e.CellElement.Children.Count = 0 OrElse Not (TypeOf e.CellElement.Children(0) Is RadDropDownListEditorElement) Then
e.CellElement.Children.Clear()
gvDropDownList = New RadDropDownListEditorElement()
For intI = 0 To mstrBatchStatusList.Count - 1
gvDropDownList.Items.Add(New RadListDataItem(mstrBatchStatusList.Item(intI).MyString, mstrBatchStatusList.Item(intI).Id))
Next
e.CellElement.Children.Add(gvDropDownList)
'
' Preset the Drop down
'
If gvDropDownList IsNot Nothing Then
If currentStatusID IsNot Nothing Then
gvDropDownList.SelectedValue = Convert.ToInt32(currentStatusID)
Else
gvDropDownList.SelectedIndex = -1
End If
End If
Else
gvDropDownList = DirectCast(e.CellElement.Children(0), RadDropDownListEditorElement)
End If
ElseIf e.CellElement.Children.Count > 0 AndAlso TypeOf e.CellElement.Children(0) Is RadDropDownListEditorElement Then
'
' Make sure any cells in the status column that are not "Open" status do not get changed to a combobox
'
e.CellElement.Children.Clear()
End If
End If
ElseIf e.CellElement.Children.Count > 0 AndAlso TypeOf e.CellElement.Children(0) Is RadDropDownListEditorElement Then
'
' Make sure any other columns do not get changed to a combobox
'
e.CellElement.Children.Clear()
End If
End If
End Sub
The above code works perfectly to setting the cell to a combobox when the Batch Status is "Open" and the drop down contains the correct values that are in my list array of (mstrBatchStatusList.Item).
Here are my questions:
1. When I want to change my combobox value to a different item in the combobox, first I need to scroll to the right since my column you can't see. I then change my value and scroll back to the left. I then scroll back to the right and my combobox becomes reset to the original value. It looks like upon scrolling right it calls the CellFormating function and when it gets to this line of the code (If e.CellElement.Children.Count = 0 OrElse Not (TypeOf e.CellElement.Children(0) Is RadDropDownListEditorElement) Then) it doesn't recognize that it's currently a combobox so it resets the combo box back to the original status id.
Why does this happen and how do I get this to not happen?
2. If there an event that can be used that triggers a combo box change event so I can check the value it's changing to and set a flag that a value changed in the grid?
Thanks
As far as I can see your goal is to have a DropDownEditor on the place of the TextEditor. If that is the case, then you need to use a custom editor, instead of adding and removing children in the CellFormating event. We have an article which can of help for this purpose - Using custom editors.
Also the article Events can be found useful.
I hope this will be useful.
Regards,
Dimitar
Telerik
DevCraft Q1'14 is here! Watch the online conference to see how this release solves your top-5 .NET challenges. Watch on demand now.
Thanks for your response and the custom editor worked much better than using the Cell Formatting but in the end I decided to go a different route.
I created the column from the beginning a GridViewComboBoxColumns. Then at runtime I dynamically set the data source, value member, display member, and field name. I then do a check and see if my status is "Open" I leave the combobox enabled else I disable the combo box so it only displays the text of my status.
Thanks again
Thank you for writing back.
I am glad that you have found a solution for your case. Do not hesitate to contact us if you have other questions.
Dimitar
Telerik
DevCraft Q1'14 is here! Watch the online conference to see how this release solves your top-5 .NET challenges. Watch on demand now.
I'm trying to add a Combobox inside the DataGrid but for certain rows and columns.
I'm using the event CellFormatting, but how can I bind the "RadDropDownListElement".
I need to Fill it with data
Here is my code:
Private Sub RadButton1_Click(sender As System.Object, e As System.EventArgs) Handles RadButton1.Click
Dim rowindex = RadGridView1.Rows.AddNew()
rowindex.Cells(0).Value = 12
rowindex.Cells(1).Value = "Name"
rowindex.Cells(2).Value = TODAY
rowindex = RadGridView1.Rows.AddNew()
rowindex.Cells(0).Value = 999
rowindex.Cells(1).Value = "Name"
rowindex.Cells(2).Value = TODAY
End Sub
Private Sub RadGridView1_CellFormatting(sender As System.Object, e As Telerik.WinControls.UI.CellFormattingEventArgs) Handles RadGridView1.CellFormatting
If e.CellElement.RowIndex <> -1 Then
If e.CellElement.ColumnIndex = 0 Then
If RadGridView1.Rows(e.CellElement.RowIndex).Cells(e.CellElement.ColumnIndex).Value = "999" Then
e.CellElement.Children.Add(New RadDropDownListElement())
End If
End If
End If
End Sub
Thank you for writing.
The CellFormatting event is not suitable for such operations since it is fired very often. This event should be used for styling the existing grid elements not for adding new ones.
To achieve the desired functionality you can use the editors' events. For example you can change the editor depending on the cell value in the EditorRequired event, then you can add a data source to this editor in the CellEditorInitialized event:
Private
Sub
radGridView1_CellEditorInitialized(sender
As
Object
, e
As
GridViewCellEventArgs)
If
TypeOf
e.ActiveEditor
Is
RadDropDownListEditor
Then
Dim
editor
As
RadDropDownListEditor = TryCast(e.ActiveEditor, RadDropDownListEditor)
Dim
element
As
RadDropDownListEditorElement = TryCast(editor.EditorElement, RadDropDownListEditorElement)
element.DataSource = GetTable1()
element.DisplayMember =
"Name"
element.ValueMember =
"ID"
End
If
End
Sub
Private
Sub
radGridView1_EditorRequired(sender
As
Object
, e
As
EditorRequiredEventArgs)
Dim
i
As
Integer
= 0
If
Integer
.TryParse(radGridView1.CurrentCell.Value.ToString(), i)
AndAlso
i = 999
Then
e.EditorType =
GetType
(RadDropDownListEditor)
Return
End
If
End
Sub
Please let me know if there is something else I can help you with.
Dimitar
Telerik
Hello,
i need help ...
try to show data from List<> but shows on that column this information System.Collections.Generic.List ' 1[ ]
how to resolve ?
Generally, such objects are displayed in a hierarchy grid. The easiest way to display the data is to let the grid generate the hierarchy by setting AutoGenerateHierarchy property to true: Object Relational Hierarchy Mode.
I hope this will be useful. Let me know if you have additional questions.
Regards,
Dimitar
Telerik by Progress