Workaround: suspend columns notifications when preview dropping and resume the notification after the drag drop service has stopped:
Dim svc As RadDragDropService = Me.RadGridView1.GridViewElement.GetService(Of RadDragDropService)()
AddHandler svc.Stopped, svc_Stopped
AddHandler svc.PreviewDragDrop, AddressOf svc_PreviewDragDrop
Private Sub svc_PreviewDragDrop(sender As Object, e As RadDropEventArgs)
For Each col As GridViewColumn In Me.RadGridView1.Columns
col.SuspendPropertyNotifications()
Next
End Sub
Private Function svc_Stopped() As Object
For Each col As GridViewColumn In Me.RadGridView1.Columns
col.ResumePropertyNotifications()
Next
End Function
To reproduce:
GridViewImageColumn imageColumn = new GridViewImageColumn();
imageColumn.Name = "ImageColumn";
imageColumn.FieldName = "ImageColumn";
imageColumn.HeaderText = "Picture";
radGridView1.MasterTemplate.Columns.Add(imageColumn);
List<classBinding> databinding = new List<classBinding>();
for (int i = 0; i < 35000; i++)
{
databinding.Add(new classBinding()
{
ImageColumn = Properties.Resources.Alarm2,
});
}
radGridView1.DataSource = databinding;
public class classBinding
{
public System.Drawing.Bitmap ImageColumn { get; set; }
}
To reproduce:
public Form1()
{
InitializeComponent();
BindingList<Item> items = new BindingList<Item>();
for (int i = 0; i < 10; i++)
{
items.Add(new Item(i,"Item" + i , DeliveryType.Type1));
}
for (int i = 10; i < 20; i++)
{
items.Add(new Item(i, "Item" + i, DeliveryType.Type2));
}
for (int i = 20; i < 30; i++)
{
items.Add(new Item(i, "Item" + i, DeliveryType.Type3));
}
this.radGridView1.DataSource = items;
this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.EnableFiltering = true;
CompositeFilterDescriptor compositeFilter = new CompositeFilterDescriptor();
compositeFilter.FilterDescriptors.Add(new FilterDescriptor("DeliveryType", FilterOperator.IsEqualTo, DeliveryType.Type2));
compositeFilter.FilterDescriptors.Add(new FilterDescriptor("DeliveryType", FilterOperator.IsEqualTo, DeliveryType.Type3));
compositeFilter.LogicalOperator = FilterLogicalOperator.Or;
this.radGridView1.FilterDescriptors.Add(compositeFilter);
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public DeliveryType DeliveryType { get; set; }
public Item(int id, string name, DeliveryType deliveryType)
{
this.Id = id;
this.Name = name;
this.DeliveryType = deliveryType;
}
}
public enum DeliveryType
{
Type1,
Type2,
Type3
}
Workaround: use custom filtering: http://docs.telerik.com/devtools/winforms/gridview/filtering/custom-filtering
The selection mode should be as in Windows Explorer - when Control is pressed, one should be able to move the current row with the up/down arrow keys and when Space is pressed, the current row should be selected/deselected.
This implementation can be used for the time being:
public partial class Form1 : RadForm
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
AddGridSimpleUnbound();
radGridView1.MultiSelect = true;
BaseGridBehavior gridBehavior = radGridView1.GridBehavior as BaseGridBehavior;
gridBehavior.UnregisterBehavior(typeof(GridViewDataRowInfo));
gridBehavior.RegisterBehavior(typeof(GridViewDataRowInfo), new MyRowBehavior());
radGridView1.GridViewElement.Navigator = new MyNavigator();
}
class MyNavigator : BaseGridNavigator
{
protected override bool DoMultiSelect(GridViewRowInfo oldRow, GridViewColumn oldColumn, GridViewRowInfo row, GridViewColumn column)
{
if (!this.IsShiftButtonPressed && this.IsControlButtonPressed && !this.IsMouseSelection)
{
return true;
}
return base.DoMultiSelect(oldRow, oldColumn, row, column);
}
}
class MyRowBehavior : GridDataRowBehavior
{
bool kbdSelection = false;
public override bool ProcessKeyPress(KeyPressEventArgs keys)
{
if (kbdSelection)
{
kbdSelection = false;
return true;
}
return base.ProcessKeyPress(keys);
}
public override bool ProcessKey(KeyEventArgs keys)
{
if (keys.KeyCode == Keys.Space && this.GridControl.MultiSelect && keys.Control)
{
this.GridControl.CurrentRow.IsSelected ^= true;
kbdSelection = true;
return false;
}
else
{
return base.ProcessKey(keys);
}
}
}
}
To reproduce: use the following code snippet. You will notice that the "Accounting Manager" group is missing.
private void Form1_Load(object sender, EventArgs e)
{
this.customersTableAdapter.Fill(this.nwindDataSet.Customers);
this.radGridView1.DataSource = this.customersBindingSource;
ColumnGroupsViewDefinition view = new ColumnGroupsViewDefinition();
view.ColumnGroups.Add(new GridViewColumnGroup("Customer Contact"));
view.ColumnGroups.Add(new GridViewColumnGroup("Details"));
view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Address"));
view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Contact"));
view.ColumnGroups[0].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[0].Rows[0].ColumnNames.Add("CompanyName");
view.ColumnGroups[0].Rows[0].ColumnNames.Add("ContactName");
view.ColumnGroups[0].Rows[0].ColumnNames.Add("ContactTitle");
view.ColumnGroups[1].Groups[0].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[1].Groups[0].Rows[0].ColumnNames.Add("Address");
view.ColumnGroups[1].Groups[0].Rows[0].ColumnNames.Add("City");
view.ColumnGroups[1].Groups[0].Rows[0].ColumnNames.Add("Country");
view.ColumnGroups[1].Groups[1].Rows.Add(new GridViewColumnGroupRow());
view.ColumnGroups[1].Groups[1].Rows[0].ColumnNames.Add("Phone");
view.ColumnGroups[1].Groups[1].Rows[0].ColumnNames.Add("Fax");
radGridView1.ViewDefinition = view;
GroupDescriptor descriptor = new GroupDescriptor();
descriptor.GroupNames.Add("ContactTitle", ListSortDirection.Ascending);
this.radGridView1.GroupDescriptors.Add(descriptor);
this.radGridView1.Groups[0].GroupRow.IsPinned = true;
}
The behavior should be consistent no matter if you change the current column or the current row.
To reproduce:
public Form1()
{
InitializeComponent();
BindingList<Item> items = new BindingList<Item>();
for (int i = 0; i < 30; i++)
{
if (i % 3 == 0)
{
items.Add(new Item(i,"Item" + i, IndeterminateBoolean.YesAndNo));
}
else if (i % 3 == 1)
{
items.Add(new Item(i, "Item" + i, IndeterminateBoolean.Yes));
}
else
{
items.Add(new Item(i, "Item" + i, IndeterminateBoolean.No));
}
}
this.radGridView1.DataSource = items;
GridViewCheckBoxColumn checkBox = new GridViewCheckBoxColumn("CheckBoxCol");
checkBox.DataTypeConverter = new IndeterminateBooleanToggleStateConverter();
checkBox.FieldName = "IsActive";
checkBox.ThreeState = true;
this.radGridView1.Columns.Add(checkBox);
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.EnableFiltering = true;
this.radGridView1.ShowHeaderCellButtons = true;
this.radGridView1.ShowFilteringRow = false;
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public IndeterminateBoolean IsActive { get; set; }
public Item(int id, string name, IndeterminateBoolean isActive)
{
this.Id = id;
this.Name = name;
this.IsActive = isActive;
}
}
public enum IndeterminateBoolean
{
No,
Yes,
YesAndNo
}
public class IndeterminateBooleanToggleStateConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(ToggleState);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType == typeof(ToggleState);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is ToggleState)
{
switch ((ToggleState)value)
{
case ToggleState.On:
return IndeterminateBoolean.Yes;
case ToggleState.Off:
return IndeterminateBoolean.No;
case ToggleState.Indeterminate:
default:
return IndeterminateBoolean.YesAndNo;
}
}
else
{
return base.ConvertFrom(context, culture, value);
}
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(ToggleState))
{
if (value is IndeterminateBoolean)
{
switch ((IndeterminateBoolean)value)
{
case IndeterminateBoolean.Yes:
return ToggleState.On;
case IndeterminateBoolean.No:
return ToggleState.Off;
case IndeterminateBoolean.YesAndNo:
default:
return ToggleState.Indeterminate;
}
}
if (value is string)
{
switch (((string)value ?? string.Empty).Trim())
{
case "Yes":
return ToggleState.On;
case "No":
case "":
return ToggleState.Off;
case "Both":
default:
return ToggleState.Indeterminate;
}
}
else
{
return base.ConvertTo(context, culture, value, destinationType);
}
}
else
{
return base.ConvertTo(context, culture, value, destinationType);
}
}
}
Workaround: use the custom filtering functionality: http://docs.telerik.com/devtools/winforms/gridview/filtering/custom-filtering
You can access the RadGridView.FilterDescriptors collection and according to the FilterDescriptor.Expression property to determine whether the row will be visible or not.
To reproduce:
public Form1()
{
InitializeComponent();
BindingList<Item> items = new BindingList<Item>();
for (int i = 0; i < 30; i++)
{
if (i % 3 == 0)
{
items.Add(new Item(i,"Item" + i, IndeterminateBoolean.YesAndNo));
}
else if (i % 3 == 1)
{
items.Add(new Item(i, "Item" + i, IndeterminateBoolean.Yes));
}
else
{
items.Add(new Item(i, "Item" + i, IndeterminateBoolean.No));
}
}
this.radGridView1.DataSource = items;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.EnableFiltering = true;
this.radGridView1.ShowHeaderCellButtons = true;
this.radGridView1.ShowFilteringRow = false;
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public IndeterminateBoolean IsActive { get; set; }
public Item(int id, string name, IndeterminateBoolean isActive)
{
this.Id = id;
this.Name = name;
this.IsActive = isActive;
}
}
public enum IndeterminateBoolean
{
No,
Yes,
YesAndNo
}
Workaround: use custom filtering http://docs.telerik.com/devtools/winforms/gridview/filtering/custom-filtering
To reproduce:
radGridView1.GridNavigator.SelectFirstRow();
for (int i = 0; i < radGridView1.RowCount; i++)
{
var result = radGridView1.GridNavigator.SelectNextRow(1);
}
Workaround:
- Move to the last row first:
radGridView1.GridNavigator.SelectLastRow();
To reproduce:
public abstract class Base
{
public abstract string Name { get; }
}
public class Child : Base
{
public override string Name
{
get { return "Child"; }
}
}
public class Child2 : Base
{
public override string Name
{
get { return "Child2"; }
}
}
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
public RadForm1()
{
InitializeComponent();
var list = new List<Base>();
list.Add(new Child());
list.Add(new Child());
list.Add(new Child2());
radGridView1.DataSource = list.ToArray();
}
}
Workaround:
radGridView1.DataSource = list;
Workaround: use custom editor element
private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
{
if (e.EditorType == typeof(RadMultiColumnComboBoxElement))
{
e.EditorType = typeof(MyRadMultiColumnComboBoxElement);
}
}
public class MyRadMultiColumnComboBoxElement : RadMultiColumnComboBoxElement
{
protected override Type ThemeEffectiveType
{
get
{
return typeof(RadMultiColumnComboBoxElement);
}
}
protected override void ProcessKeyDown(object sender, KeyEventArgs e)
{
base.ProcessKeyDown(sender, e);
FieldInfo fi = this.GetType().BaseType.BaseType.GetField("oldTextValue", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, this.textBox.Text.Substring(0, this.textBox.SelectionStart));
}
}
To reproduce:
private void Form2_Load(object sender, EventArgs e)
{
this.productsTableAdapter.Fill(this.nwindDataSet.Products);
this.categoriesTableAdapter.Fill(this.nwindDataSet.Categories);
this.radGridView1.AutoGenerateHierarchy = true;
this.radGridView1.DataSource = this.nwindDataSet;
this.radGridView1.DataMember = "Categories";
this.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.MasterTemplate.Templates.First().AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewSummaryItem summaryItem = new GridViewSummaryItem();
summaryItem.Name = "CategoryID";
summaryItem.Aggregate = GridAggregateFunction.Count;
GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem();
summaryRowItem.Add(summaryItem);
this.radGridView1.SummaryRowsTop.Add(summaryRowItem);
GridViewSummaryItem summaryItem2 = new GridViewSummaryItem();
summaryItem2.Name = "UnitPrice";
summaryItem2.Aggregate = GridAggregateFunction.Sum;
GridViewSummaryRowItem summaryRowItem2 = new GridViewSummaryRowItem();
summaryRowItem2.Add(summaryItem2);
this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop.Add(summaryRowItem2);
}
private void SetNumberFormat()
{
this.radGridView1.Columns["CategoryID"].FormatString = "{0:F4}";
this.radGridView1.SummaryRowsTop[0][0].FormatString = "{0:F4}";
this.radGridView1.MasterTemplate.Templates.First().Columns["UnitPrice"].FormatString = "{0:F4}";
this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop[0][0].FormatString = "{0:F4}";
}
private void radButton1_Click(object sender, EventArgs e)
{
SetNumberFormat();
}
Workaround: Clear and add back the summary rows when a value in the child template is changed.
private void radButton1_Click(object sender, EventArgs e)
{
this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop.Clear();
GridViewSummaryItem summaryItem2 = new GridViewSummaryItem();
summaryItem2.Name = "UnitPrice";
summaryItem2.Aggregate = GridAggregateFunction.Sum;
GridViewSummaryRowItem summaryRowItem2 = new GridViewSummaryRowItem();
summaryRowItem2.Add(summaryItem2);
this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop.Add(summaryRowItem2);
SetNumberFormat();
}
To reproduce:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.RadGridView1.AutoGenerateColumns = False
Dim column = New GridViewTextBoxColumn
column.Name = "Name"
column.FieldName = "ChildItem"
column.DataType = GetType(CustomItem)
column.DataTypeConverter = New CustomItemTypeConverter()
Me.RadGridView1.Columns.Add(column)
Me.RadGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill
Dim objects =
{
New CustomContainer With {.ChildItem = New CustomItem With {.Name = "A"}},
New CustomContainer With {.ChildItem = New CustomItem With {.Name = "B"}},
New CustomContainer With {.ChildItem = New CustomItem With {.Name = "C"}}
}
Me.RadGridView1.DataSource = objects
End Sub
Private Sub RadGridView_EditorRequired(sender As Object, e As EditorRequiredEventArgs) Handles RadGridView1.EditorRequired
e.EditorType = GetType(GridSpinEditor)
End Sub
Class CustomContainer
Public Property ChildItem As CustomItem
End Class
Class CustomItem
Public Property Name As String
End Class
Class CustomItemTypeConverter
Inherits TypeConverter
Public Overrides Function CanConvertFrom(context As ITypeDescriptorContext, sourceType As Type) As Boolean
If sourceType = GetType(Decimal) Then
Return True
End If
Return MyBase.CanConvertFrom(context, sourceType)
End Function
Public Overrides Function CanConvertTo(context As ITypeDescriptorContext, destinationType As Type) As Boolean
If destinationType = GetType(Decimal) OrElse destinationType = GetType(String) OrElse destinationType = GetType(CustomItem) Then
Return True
End If
Return MyBase.CanConvertTo(context, destinationType)
End Function
Public Overrides Function ConvertTo(context As ITypeDescriptorContext, culture As System.Globalization.CultureInfo, _
value As Object, destinationType As Type) As Object
If TypeOf value Is CustomItem Then
Dim customValue = DirectCast(value, CustomItem)
If destinationType = GetType(Decimal) Then
Return Microsoft.VisualBasic.AscW(customValue.Name.Chars(0))
ElseIf destinationType = GetType(String) Then
Return customValue.Name
ElseIf destinationType = GetType(CustomItem) Then
Return customValue
Else
Return MyBase.ConvertTo(context, culture, value, destinationType)
End If
End If
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function
Public Overrides Function ConvertFrom(context As ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object) As Object
If TypeOf value Is Decimal Then
Dim decValue = DirectCast(value, Decimal)
Dim intValue = CInt(decValue)
Dim charValue = Microsoft.VisualBasic.ChrW(intValue)
Return New CustomItem With {.Name = New String(charValue, 1)}
End If
Return MyBase.ConvertFrom(context, culture, value)
End Function
End Class
Workaround:
Public Class MyEditor
Inherits GridSpinEditor
Public Overrides ReadOnly Property IsModified() As Boolean
Get
If Me.originalValue Is Nothing Then
Return (Me.Value IsNot Nothing AndAlso Me.Value <> DBNull.Value)
End If
If Me.Value Is Nothing Then
Return (Me.originalValue IsNot Nothing AndAlso Me.originalValue <> DBNull.Value)
End If
Dim column As GridViewDataColumn = (DirectCast(Me.OwnerElement, GridDataCellElement)).ColumnInfo
If column.DataTypeConverter IsNot Nothing AndAlso column.DataTypeConverter.CanConvertTo(Me.OwnerElement, GetType(Decimal)) Then
Return Not column.DataTypeConverter.ConvertTo(Me.OwnerElement, column.FormatInfo, Me.originalValue, GetType(Decimal)).Equals(Convert.ToDecimal(Me.Value))
End If
Return Not Convert.ToDecimal(Me.originalValue).Equals(Convert.ToDecimal(Me.Value))
End Get
End Property
End Class
Private Sub RadGridView_EditorRequired(sender As Object, e As EditorRequiredEventArgs) Handles RadGridView1.EditorRequired
e.EditorType = GetType(MyEditor)
End Sub
To reproduce:
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
for (int i = 0; i < 5; i++)
{
dt.Columns.Add("Col"+i);
}
for (int i = 0; i < 2000; i++)
{
DataRow row = dt.NewRow();
foreach (DataColumn col in dt.Columns)
{
row[col.ColumnName] = "Data" + i + "." + dt.Columns.IndexOf(col);
}
dt.Rows.Add(row);
}
this.radGridView1.DataSource = dt;
this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
}
private void radButton1_Click(object sender, EventArgs e)
{
RadPrintPreviewDialog dialog = new RadPrintPreviewDialog();
dialog.Document = this.radPrintDocument1;
dialog.ShowDialog();
}
Workaround: this.radGridView1.AutoSizeRows = true;
Workaround: use a custom BaseGridBehavior
public Form1()
{
InitializeComponent();
this.radGridView1.GridBehavior = new MyBaseGridBehavior();
}
public class MyBaseGridBehavior : BaseGridBehavior
{
public override bool ProcessKey(KeyEventArgs keys)
{
if (keys.Control && this.GridControl.CurrentColumn == null)
{
return false;
}
return base.ProcessKey(keys);
}
}
To reproduce:
Search a specific text by focusing the search box programmatically and the using the SendKeys method:
private void radButton1_Click(object sender, EventArgs e)
{
GridSearchCellElement searchCell = radGridView1.TableElement.GetCellElement(radGridView1.MasterView.TableSearchRow, null) as GridSearchCellElement;
if (searchCell != null)
{
searchCell.SearchTextBox.Focus();
searchCell.SearchTextBox.Text = string.Empty;
SendKeys.Send("t");
SendKeys.Send("e");
SendKeys.Send("s");
SendKeys.Send("t");
}
}
Workaround:
Repeat the search in the SearchProgressChanged event:
radGridView1.MasterView.TableSearchRow.SearchProgressChanged += TextationSearchProgressHandler;
protected void TextationSearchProgressHandler(object sender, SearchProgressChangedEventArgs e)
{
if (e.SearchFinished && null != radGridView1.TableElement)
{
GridSearchCellElement searchCell = radGridView1.TableElement.GetCellElement(radGridView1.MasterView.TableSearchRow, null) as GridSearchCellElement;
if (searchCell != null
&& searchCell.SearchTextBox.TextBoxItem.Text != e.SearchCriteria)
{
radGridView1.MasterView.TableSearchRow.Search(searchCell.SearchTextBox.TextBoxItem.Text);
}
}
}
Please refer to the attached screenshot and sample video.
Workaround:
public class CustomGrid : RadGridView
{
public override string ThemeClassName
{
get
{
return typeof(RadGridView).FullName;
}
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
this.BeginEdit();
if (this.GridViewElement.ActiveEditor is RadDropDownListEditor)
{
string symbol = e.KeyChar.ToString();
RadDropDownListEditor editor = this.GridViewElement.ActiveEditor as RadDropDownListEditor;
RadDropDownListEditorElement element = editor.EditorElement as RadDropDownListEditorElement;
if ((element.AutoCompleteMode & AutoCompleteMode.Suggest) == AutoCompleteMode.Suggest)
{
element.EditableElementText += symbol;
element.EditableElement.SelectionStart = 1;
element.EditableElement.SelectionLength = 0;
}
}
base.OnKeyPress(e);
}
}
To reproduce:
private void Form1_Load(object sender, EventArgs e)
{
this.suppliersTableAdapter.Fill(this.nwindDataSet.Suppliers);
this.productsTableAdapter.Fill(this.nwindDataSet.Products);
radGridView1.DataSource = nwindDataSet.Suppliers;
radGridView1.BestFitColumns(BestFitColumnMode.AllCells);
GridViewTemplate template = CreateTemplate(this.productsBindingSource);
template.DataSource = nwindDataSet.Products;
radGridView1.MasterTemplate.Templates.Add(template);
GridViewRelation relation = new GridViewRelation(radGridView1.MasterTemplate);
relation.ChildTemplate = template;
relation.RelationName = "SuppliersProducts";
relation.ParentColumnNames.Add("SupplierID");
relation.ChildColumnNames.Add("SupplierID");
radGridView1.Relations.Add(relation);
}
private GridViewTemplate CreateTemplate(BindingSource source)
{
GridViewTemplate template = new GridViewTemplate();
template.Caption = "TaskTemplate";
template.AllowAddNewRow = false;
template.EnableFiltering = true;
FilterDescriptor filter = new FilterDescriptor();
filter.PropertyName = "ReorderLevel";
filter.Operator = FilterOperator.IsNotEqualTo;
filter.Value = 25;
template.FilterDescriptors.Add(filter);
template.ShowFilteringRow = false;
template.SortDescriptors.Expression = "ProductName ASC, UnitPrice ASC";
template.DataSource = source;
template.BestFitColumns(BestFitColumnMode.AllCells);
return template;
}
Workaround: set the filter after the hierarchy setup:
private void Form1_Load(object sender, EventArgs e)
{
this.suppliersTableAdapter.Fill(this.nwindDataSet.Suppliers);
this.productsTableAdapter.Fill(this.nwindDataSet.Products);
radGridView1.DataSource = nwindDataSet.Suppliers;
radGridView1.BestFitColumns(BestFitColumnMode.AllCells);
GridViewTemplate template = CreateTemplate(this.productsBindingSource);
template.DataSource = nwindDataSet.Products;
radGridView1.MasterTemplate.Templates.Add(template);
GridViewRelation relation = new GridViewRelation(radGridView1.MasterTemplate);
relation.ChildTemplate = template;
relation.RelationName = "SuppliersProducts";
relation.ParentColumnNames.Add("SupplierID");
relation.ChildColumnNames.Add("SupplierID");
radGridView1.Relations.Add(relation);
FilterDescriptor filter = new FilterDescriptor();
filter.PropertyName = "ReorderLevel";
filter.Operator = FilterOperator.IsNotEqualTo;
filter.Value = 25;
template.FilterDescriptors.Add(filter);
}
private GridViewTemplate CreateTemplate(BindingSource source)
{
GridViewTemplate template = new GridViewTemplate();
template.Caption = "TaskTemplate";
template.AllowAddNewRow = false;
template.EnableFiltering = true;
template.ShowFilteringRow = false;
template.SortDescriptors.Expression = "ProductName ASC, UnitPrice ASC";
template.DataSource = source;
template.BestFitColumns(BestFitColumnMode.AllCells);
return template;
}
To reproduce:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products)
Me.CategoriesTableAdapter.Fill(Me.NwindDataSet.Categories)
RadGridView1.AutoGenerateHierarchy = True
RadGridView1.DataSource = Me.NwindDataSet
RadGridView1.DataMember = "Categories"
Me.RadGridView1.MasterTemplate.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill
Me.RadGridView1.MasterTemplate.Templates(0).AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill
Me.RadGridView1.UseScrollbarsInHierarchy = True
End Sub
Private Sub RadGridView1_ViewCellFormatting(sender As Object, e As CellFormattingEventArgs) Handles RadGridView1.ViewCellFormatting
If e.Row.HierarchyLevel > 0 Then
e.CellElement.TableElement.RowHeaderColumnWidth = 100
End If
End Sub
To reproduce:
private void Form1_Load(object sender, EventArgs e)
{
this.productsTableAdapter.Fill(this.nwindDataSet.Products);
this.categoriesTableAdapter.Fill(this.nwindDataSet.Categories);
this.radGridView1.DataSource = this.productsBindingSource;
GridViewMultiComboBoxColumn col = new GridViewMultiComboBoxColumn();
col.DataSource = this.categoriesBindingSource;
col.MinWidth = 200;
col.DisplayMember = "CategoryName";
col.ValueMember = "CategoryID";
this.radGridView1.Columns.Add(col);
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.CellValueChanged += radGridView1_CellValueChanged;
}
private void radGridView1_CellValueChanged(object sender, GridViewCellEventArgs e)
{
RadMessageBox.Show("CellValueChanged. Value >> " + e.Value.ToString());
}