<
ajax:RadComboBox
ID
=
"DdlProject"
runat
=
"server"
Width
=
"240px"
EnableLoadOnDemand
=
"True"
Text
=
" "
AllowCustomText
=
"false"
EnableVirtualScrolling
=
"true"
EnableAutomaticLoadOnDemand
=
"true"
>
<
ItemTemplate
>
<
asp:CheckBox
runat
=
"server"
ID
=
"chkProject"
oncheckedchanged
=
"chk_CheckedChangedProject"
AutoPostBack
=
"true"
Text='<%#Eval("ProjectName")%>' />
</
ItemTemplate
>
</
ajax:RadComboBox
>
dsProject = getGetProject(mstrCompNo)
DdlProject.DataSource = dsProject
DdlProject.DataTextField = "ProjectId"
DdlProject.DataValueField = "ProjectName"
DdlProject.DataBind()
rgdProduct.ExportSettings.ExportOnlyData = true;
rgdProduct.ExportSettings.IgnorePaging = true;
rgdProduct.ExportSettings.OpenInNewWindow = true;
<
ExportSettings
HideStructureColumns
=
"true"
IgnorePaging
=
"true"
ExportOnlyData
=
"true"
FileName
=
"Result"
OpenInNewWindow
=
"true"
>
<
Pdf
PageHeight
=
"210mm"
PageWidth
=
"297mm"
PageTitle
=
"Product"
DefaultFontFamily
=
"Arial Unicode MS"
PageBottomMargin
=
"20mm"
PageTopMargin
=
"20mm"
PageLeftMargin
=
"20mm"
PageRightMargin
=
"20mm"
/>
</
ExportSettings
>
Ok-
Can anyone give me any insight into how the DynamicRadGrid Column Filters work? Here is the scenario.
I am using DynamicData and the Telerik.Web.UI.DynamicRadGrid.
I have created a custom class that inherits from ITemplate. My Custom Template Class builds a RadComboBox using the MetaForeignKeyColumn passed to it. In the Template Class I have also subscribed to the ComboBox.selectedIndexChanged Event and fire the Filter event passin a new Pair that contains the columnname and value to filter on.
/// <summary>
/// Summary description for ForeignKeyFilterTemplate
/// </summary>
public
class
DDForeignKeyFilterTemplate : ITemplate
{
private
MetaForeignKeyColumn _column;
private
RadComboBox _ddlb =
new
RadComboBox();
private
const
string
NullValueString =
"[null]"
;
private
DSIWebDbDataContext _context;
private
string
_filterColumnName =
string
.Empty;
public
DDForeignKeyFilterTemplate(MetaForeignKeyColumn MetaColumn)
{
_column = MetaColumn;
_ddlb.Skin =
"WebBlue"
;
_ddlb.EnableViewState =
true
;
_ddlb.AutoPostBack =
true
;
_ddlb.AllowCustomText =
false
;
_filterColumnName = _column.ForeignKeyNames[0];
}
#region ITemplate Members
public
void
InstantiateIn(Control container)
{
_ddlb.SelectedIndexChanged +=
new
RadComboBoxSelectedIndexChangedEventHandler(_ddlb_SelectedIndexChanged);
if
(_ddlb.Items.Count <= 0)
{
if
(!_column.IsRequired)
_ddlb.Items.Add(
new
RadComboBoxItem(
"[Not Set]"
));
PopulateListControl();
}
container.Controls.Add(_ddlb);
}
void
_ddlb_SelectedIndexChanged(
object
sender, RadComboBoxSelectedIndexChangedEventArgs e)
{
((GridFilteringItem)(((RadComboBox)sender).Parent.Parent)).FireCommandEvent(
"Filter"
,
new
Pair(e.Text, _column.Name));
}
private
void
PopulateListControl()
{
_context = (DSIWebDbDataContext)_column.Table.CreateContext();
string
PrimaryKeyName = _column.ParentTable.PrimaryKeyColumns[0].Name;
string
DispalyColumnName = _column.ParentTable.DisplayColumn.Name;;
string
ParentTableName = _column.ParentTable.Name;
_ddlb.DataValueField = PrimaryKeyName;
_ddlb.DataTextField = DispalyColumnName;
switch
(ParentTableName)
{
case
"Bookings"
:
loadBookings();
break
;
case
"SiteLocations"
:
loadSiteLocations();
break
;
case
"ContainerSizes"
:
loadContainerSize();
break
;
case
"Drivers"
:
loadDrivers();
break
;
case
"Carriers"
:
loadCarriers();
break
;
case
"YardPositions"
:
loadYardPositions();
break
;
case
"ContainerTypes"
:
loadContainerTypes();
break
;
}
}
private
void
loadBookings()
{
var results = _context.Bookings.Select(b =>
new
idname() { id = b.booking_key.ToString(), name = b.Booking_Number });
results.OrderBy(o => o.name);
if
(results.Count() > 0)
{
foreach
(var item
in
results)
{
_ddlb.Items.Add(
new
RadComboBoxItem(item.name, item.id));
}
}
}
private
void
loadSiteLocations()
{
var results = _context.SiteLocations.Select(b =>
new
idname() { id = b.ref_key.ToString(), name = b.Location });
results.OrderBy(o => o.name);
if
(results.Count() > 0)
{
foreach
(var item
in
results)
{
_ddlb.Items.Add(
new
RadComboBoxItem(item.name, item.id));
}
}
}
In the DynamicRadGrid Init Method I am creating a new instance of my Template Class and assigning it to the DynamicGridBoundColumn.FilterTemplate.
DynamicGridBoundColumn gridColumn =
new
DynamicGridBoundColumn();
string
fieldName =
string
.Empty;
string
fieldAlias =
string
.Empty;
gridColumn.DataField = column.Name;
gridColumn.ConvertEmptyStringToNull = column.ConvertEmptyStringToNull;
gridColumn.DataFormatString = column.DataFormatString;
gridColumn.UIHint = column.UIHint;
gridColumn.HtmlEncode = column.HtmlEncode;
gridColumn.NullDisplayText = column.NullDisplayText;
gridColumn.ApplyFormatInEditMode = column.ApplyFormatInEditMode;
gridColumn.HeaderText = column.DisplayName.Replace(
"_"
,
" "
);
gridColumn.Resizable =
true
;
fieldAlias = column.DisplayName;
fieldAlias = fieldAlias.Replace(
"_"
,
""
);
//Set up grouping for ForeignKeyColumns
if
(column
is
MetaForeignKeyColumn)
{
fieldName = ((MetaForeignKeyColumn)column).ForeignKeyNames[0];
gridColumn.FilterTemplate =
new
DDForeignKeyFilterTemplate(((MetaForeignKeyColumn)column));
gridColumn.FilterListOptions = GridFilterListOptions.VaryByDataTypeAllowCustom;
}
else
{
fieldName = column.Name;
fieldAlias = column.DisplayName;
gridColumn.FilterListOptions = GridFilterListOptions.VaryByDataType;
}
// Country [Country], count(Country) Items [Items] Group By Country
gridColumn.GroupByExpression = fieldName +
" ["
+ fieldAlias +
"], count("
+ fieldName +
") Items [Items] Group By "
+ fieldName;
MasterTableView.Columns.Add(gridColumn);
This works great and I get the RadComboBox boxes with the appropriate ParentTable values as custom filter dropdowns in each column of the Grid.
The issue:
When i select a new value in the dropdowns, i am getting value not found error on the filter event.
I have tried to overload the DynamicGridBoundColumn both the GetCurrentFilterValueFromControl and the SetCurrentFilterValueToControl.
protected
override
string
GetCurrentFilterValueFromControl(TableCell cell)
{
if
(cell.Controls[0]
is
RadComboBox)
{
string
currentValue = ((RadComboBox)cell.Controls[0]).SelectedItem.Text;
this
.CurrentFilterFunction = (currentValue !=
""
&& currentValue !=
"empty "
) ? GridKnownFunction.EqualTo : GridKnownFunction.NoFilter;
return
currentValue;
}
else
return
base
.GetCurrentFilterValueFromControl(cell);
}
protected
override
void
SetCurrentFilterValueToControl(TableCell cell)
{
if
(cell.Controls[0]
is
RadComboBox)
{
if
(!(
this
.CurrentFilterValue ==
""
))
{
((RadComboBox)cell.Controls[0]).Items.FindItemByText(
this
.CurrentFilterValue).Selected =
true
;
}
}
else
base
.SetCurrentFilterValueToControl(cell);
}
I have even trapped the event in the Grid_ItemCommand Event setting the FilterExpression on the column and the MasterTableView.
#region Filter Items
if
(e.CommandName == RadGrid.FilterCommandName)
{
Pair filterPair = (Pair)e.CommandArgument;
GridFilteringItem item = e.Item
as
GridFilteringItem;
GridColumn filterColumn = item.OwnerTableView.GetColumn(filterPair.Second.ToString());
filterColumn.CurrentFilterFunction = GridKnownFunction.EqualTo;
filterColumn.CurrentFilterValue = filterPair.First.ToString();
RadGrid1.MasterTableView.FilterExpression = filterColumn.EvaluateFilterExpression(item);
}
#endregion
I'm not sure if there is something i am missing. The underlying column that i am trying to filter is a DynamicControl and is a ForeignKey so the values of the drid are actually the DisplayName of the parent table. At one point i was getting a datatype miss-match as the comparer was trying to filter the EntityName (SiteLocation) to a string, which was the value (key) selected in the dropdown from the parrent table.
Any Ideas or help would be appreciated.
Thanks
Paul