I set a filter callback for a ComboBoxColumn in the CellEditorInitialized event handler like this:
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter = FilterWrappers;
}
This works fine. The problem is that I have another ComboBoxColumn with no filter on it. When I click in the first column and select a value and then click in the second column the filter method for the first column is called. It is called once for every item in the combo but the entries contain items from the first combo and items from the second combo. Why is this happening?
8 Answers, 1 is accepted
Thank you for writing.
I assume that this is happening, because the posted code which I assume is in the CellEditorInitialized event is not restricted to be executed only for the desired column. In other words, please try the following snippet, and just modify the YourFirstColumnName string to the name of the column, where you want the filter applied:
void
radGridView1_CellEditorInitialized(
object
sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
{
if
(e.Column.Name ==
"YourFirstColumnName"
)
{
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter = FilterWrappers;
}
}
}
Let me know how this works for you.
Regards,
Stefan
the Telerik team
In order to be performance optimized and to consume less memory, RadGridView control uses one ComboBox editor in this case and the filter delegate will be available to another column too. To address the issue, you can Reset the filter delegate for other columns:
void
radGridView1_CellEditorInitialized(
object
sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
{
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(e.Column.Name ==
"YourFirstColumnName"
)
{
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter = FilterWrappers;
}
}
else
{
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter =
null
;
}
}
}
I hope this helps. Do not hesitate to contact us if you have further questions or issues.
Kind regards,
Julian Benkov
the Telerik team
See the code below. What happens is that if I select the WRAPPER column, then I select the PHASE column, and then select the WRAPPER column again, I see item from the PHASE column in the filter for the WRAPPER. The problem comes when it tries to convert one of the items to an int. The WRAPPER column contains int values and the PHASE column contains string value. As you can see I have cleared the Filter property. I put this code in as a hail-mary attempt to make this work but it failed. Please attempt to explain why this is not working.
private
void
radGridView1_CellEditorInitialized(
object
sender, GridViewCellEventArgs e)
{
if
(e.Column
is
GridViewComboBoxColumn)
{
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter =
null
;
}
}
switch
(e.Column.Name)
{
case
"WRAPPER"
:
{
GridViewComboBoxColumn cbc = e.Column
as
GridViewComboBoxColumn;
cbc.DataSource = dataWrappers;
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter = FilterWrappers;
}
}
break
;
case
"PHASE"
:
{
GridViewComboBoxColumn cbc = e.Column
as
GridViewComboBoxColumn;
cbc.DataSource = dataPhases;
}
break
;
}
}
private
bool
FilterWrappers(RadListDataItem item)
{
// cannot select a wrapper if an HTC is not selected first
if
(CurrentItem.HEAT_TRACE_CONTROLLER_NO ==
null
||
CurrentItem.HEAT_TRACE_CONTROLLER_NO.Length == 0)
{
return
false
;
}
int
? nWrapper =
null
;
if
(item.Value.ToString() != String.Empty)
nWrapper = Convert.ToInt32(item.Value);
// if it is PAC or if settings allow multiple items to be
// connected to a wrapper, then let the wrapper be used
if
(EHTS.Properties.Settings.Default.CircuitAssignment_AllowMultipleLTSItemsPerWrapper ||
CurrentItem.CONTROL_TYPE ==
"PAC"
)
{
return
true
;
}
// determine if the wrapper is already assigned to another power point
var data = (from gi
in
GridItems
where gi.WRAPPER == nWrapper &&
gi.ID != CurrentItem.ID &&
gi.HEAT_TRACE_CONTROLLER_NO == CurrentItem.HEAT_TRACE_CONTROLLER_NO
select gi).FirstOrDefault();
// if data is not null, then the wrapper is already used
return
(data ==
null
);
}
Thank you for the provided information. However, it did not allow us to reproduce the case and assist you accordingly. Therefore, I would kindly ask you to open a new support ticket and attach a sample project with some part of your data. This will allow to analyze your case in depth, hence provide you with further assistance.
Thank you for your time and cooperation.
Greetings,Julian Benkov
the Telerik team
I cannot submit a ticket since my support contract has expired and we have not renewed it yet. It is in the process though.
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Linq;
using
System.Text;
using
System.Windows.Forms;
using
Telerik.WinControls.UI;
namespace
RadControlsWinFormsApp2
{
public
partial
class
Form1 : Form
{
private
String[] dataPhases =
null
;
private
String[] dataWrappers =
null
;
public
class
Data
{
public
Data(
int
ID,
string
Phase,
int
Wrapper)
{
this
.ID = ID;
this
.Phase = Phase;
this
.Wrapper = Wrapper;
}
public
int
ID {
get
;
set
; }
public
String Phase {
get
;
set
; }
public
int
Wrapper {
get
;
set
; }
}
public
Form1()
{
InitializeComponent();
this
.radGridView1.DataSource =
new
Data[] {
new
Data(1,
"A"
, 1),
new
Data(2,
"B"
, 2) };
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
GridViewComboBoxColumn columnPhase = radGridView1.Columns[
"PHASE"
]
as
GridViewComboBoxColumn;
dataPhases =
new
String[] {
"A"
,
"B"
,
"C"
,
"A/B/C"
};
GridViewComboBoxColumn columnWrapper = radGridView1.Columns[
"WRAPPER"
]
as
GridViewComboBoxColumn;
dataWrappers =
new
String[] {
""
,
"1"
,
"2"
};
columnWrapper.DataSource = dataWrappers;
columnPhase.DataSource = dataPhases;
}
private
void
radGridView1_CellEditorInitialized(
object
sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
{
if
(e.Column
is
GridViewComboBoxColumn)
{
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter =
null
;
}
}
switch
(e.Column.Name)
{
case
"WRAPPER"
:
{
GridViewComboBoxColumn cbc = e.Column
as
GridViewComboBoxColumn;
cbc.DataSource = dataWrappers;
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter = FilterWrappers;
}
}
break
;
case
"PHASE"
:
{
GridViewComboBoxColumn cbc = e.Column
as
GridViewComboBoxColumn;
cbc.DataSource = dataPhases;
}
break
;
}
}
private
bool
FilterWrappers(RadListDataItem item)
{
int
nWrapper = 0;
if
(item.Value.ToString() != String.Empty)
nWrapper = Convert.ToInt32(item.Value);
return
true
;
}
}
}
namespace
RadControlsWinFormsApp2
{
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()
{
Telerik.WinControls.UI.GridViewTextBoxColumn gridViewTextBoxColumn1 =
new
Telerik.WinControls.UI.GridViewTextBoxColumn();
Telerik.WinControls.UI.GridViewComboBoxColumn gridViewComboBoxColumn1 =
new
Telerik.WinControls.UI.GridViewComboBoxColumn();
Telerik.WinControls.UI.GridViewComboBoxColumn gridViewComboBoxColumn2 =
new
Telerik.WinControls.UI.GridViewComboBoxColumn();
this
.radGridView1 =
new
Telerik.WinControls.UI.RadGridView();
((System.ComponentModel.ISupportInitialize)(
this
.radGridView1)).BeginInit();
this
.SuspendLayout();
//
// radGridView1
//
this
.radGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this
.radGridView1.Location =
new
System.Drawing.Point(13, 13);
//
// radGridView1
//
gridViewTextBoxColumn1.FieldName =
"ID"
;
gridViewTextBoxColumn1.HeaderText =
"ID"
;
gridViewTextBoxColumn1.Name =
"columnID"
;
gridViewComboBoxColumn1.DisplayMember =
"Wrapper"
;
gridViewComboBoxColumn1.FieldName =
"Wrapper"
;
gridViewComboBoxColumn1.HeaderText =
"Wrapper"
;
gridViewComboBoxColumn1.Name =
"WRAPPER"
;
gridViewComboBoxColumn1.ValueMember =
"Wrapper"
;
gridViewComboBoxColumn1.Width = 100;
gridViewComboBoxColumn2.DisplayMember =
"Phase"
;
gridViewComboBoxColumn2.FieldName =
"Phase"
;
gridViewComboBoxColumn2.HeaderText =
"Phase"
;
gridViewComboBoxColumn2.Name =
"PHASE"
;
gridViewComboBoxColumn2.ValueMember =
"Phase"
;
gridViewComboBoxColumn2.Width = 100;
this
.radGridView1.MasterTemplate.Columns.AddRange(
new
Telerik.WinControls.UI.GridViewDataColumn[] {
gridViewTextBoxColumn1,
gridViewComboBoxColumn1,
gridViewComboBoxColumn2});
this
.radGridView1.Name =
"radGridView1"
;
this
.radGridView1.Size =
new
System.Drawing.Size(588, 248);
this
.radGridView1.TabIndex = 0;
this
.radGridView1.Text =
"radGridView1"
;
this
.radGridView1.CellEditorInitialized +=
new
Telerik.WinControls.UI.GridViewCellEventHandler(
this
.radGridView1_CellEditorInitialized);
//
// Form1
//
this
.AutoScaleDimensions =
new
System.Drawing.SizeF(6F, 13F);
this
.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this
.ClientSize =
new
System.Drawing.Size(613, 273);
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;
}
}
I debugged the sample project and found the synchronization issues in our DropDownEditor when the filter is applied and DataSource or SelectedItem is changed internally. I logged the issue in our Public Issue Tracking System. It will be addressed in one of the next our releases after the upcoming Q1 2012 SP1 release. Currently, you can use EditorRequired event to work around the issue:
using
System;
using
System.Windows.Forms;
using
Telerik.WinControls.UI;
namespace
Lab.GridView
{
public
partial
class
DropDownListEditorFiltering : Form
{
private
String[] dataPhases =
null
;
private
String[] dataWrappers =
null
;
public
class
Data
{
public
Data(
int
ID,
string
Phase,
int
Wrapper)
{
this
.ID = ID;
this
.Phase = Phase;
this
.Wrapper = Wrapper;
}
public
int
ID {
get
;
set
; }
public
String Phase {
get
;
set
; }
public
int
Wrapper {
get
;
set
; }
}
public
DropDownListEditorFiltering()
{
InitializeComponent();
this
.radGridView1.EditorRequired += radGridView1_EditorRequired;
this
.radGridView1.DataSource =
new
Data[] {
new
Data(1,
"A"
, 1),
new
Data(2,
"B"
, 2) };
}
void
radGridView1_EditorRequired(
object
sender, EditorRequiredEventArgs e)
{
if
(radGridView1.CurrentColumn.Name ==
"PHASE"
|| radGridView1.CurrentColumn.Name ==
"WRAPPER"
)
{
e.Editor =
new
MyEditor();
}
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
GridViewComboBoxColumn columnPhase = radGridView1.Columns[
"PHASE"
]
as
GridViewComboBoxColumn;
dataPhases =
new
String[] {
"A"
,
"B"
,
"C"
,
"A/B/C"
};
GridViewComboBoxColumn columnWrapper = radGridView1.Columns[
"WRAPPER"
]
as
GridViewComboBoxColumn;
dataWrappers =
new
String[] {
""
,
"1"
,
"2"
};
columnWrapper.DataSource = dataWrappers;
columnPhase.DataSource = dataPhases;
}
private
void
radGridView1_CellEditorInitialized(
object
sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
{
switch
(e.Column.Name)
{
case
"WRAPPER"
:
{
RadDropDownListEditor editor = e.ActiveEditor
as
RadDropDownListEditor;
if
(editor !=
null
)
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)editor.EditorElement;
editorElement.Filter = FilterWrappers;
}
GridViewComboBoxColumn cbc = e.Column
as
GridViewComboBoxColumn;
cbc.DataSource = dataWrappers;
}
break
;
case
"PHASE"
:
{
GridViewComboBoxColumn cbc = e.Column
as
GridViewComboBoxColumn;
cbc.DataSource = dataPhases;
}
break
;
}
}
private
bool
FilterWrappers(RadListDataItem item)
{
int
nWrapper = 0;
if
(item.Value.ToString() != String.Empty)
nWrapper = Convert.ToInt32(item.Value);
return
true
;
}
public
class
MyEditor : Telerik.WinControls.UI.RadDropDownListEditor
{
public
override
bool
EndEdit()
{
RadDropDownListEditorElement editorElement = (RadDropDownListEditorElement)
this
.EditorElement;
editorElement.Filter =
null
;
return
base
.EndEdit();
}
}
}
}
Thank you for the sample code. Your Telerik points have been updated.
All the best,
Julian Benkov
the Telerik team