It would be more convenient to the end user to have a single checkbox in the header of RadListView(DetailsView) which will check/uncheck all the items in RadListView. Also, the group items should have a checkbox which checks/unchecks all the items in that group.
Currently, the possible solution is to use the following code snippet:
private RadCheckBoxElement checkBox;
public RadForm1()
{
InitializeComponent();
this.radListView1.DataSource = this.productsBindingSource;
this.radListView1.ViewType = ListViewType.DetailsView;
this.radListView1.ShowCheckBoxes = true;
this.checkBox = new RadCheckBoxElement();
this.checkBox.Margin = new Padding(0, 10, 0, 0);
this.checkBox.ToggleStateChanged += new StateChangedEventHandler(checkBox_ToggleStateChanged);
this.radListView1.ItemCheckedChanged += new ListViewItemEventHandler(radListView1_ItemCheckedChanged);
this.checkBox.ZIndex = 1000;
this.checkBox.Alignment = ContentAlignment.TopLeft;
this.checkBox.StretchHorizontally = this.checkBox.StretchVertically = false;
this.checkBox.IsThreeState = true;
this.radListView1.ListViewElement.Children.Add(this.checkBox);
}
private void checkBox_ToggleStateChanged(object sender, StateChangedEventArgs args)
{
if (this.checkBox.ToggleState == ToggleState.Indeterminate)
{
this.checkBox.ToggleState = ToggleState.Off;
return;
}
this.radListView1.BeginUpdate();
this.radListView1.ItemCheckedChanged -= new ListViewItemEventHandler(radListView1_ItemCheckedChanged);
foreach (ListViewDataItem item in this.radListView1.Items)
{
item.CheckState = this.checkBox.ToggleState;
}
this.radListView1.EndUpdate();
this.radListView1.ItemCheckedChanged += new ListViewItemEventHandler(radListView1_ItemCheckedChanged);
}
private void radListView1_ItemCheckedChanged(object sender, ListViewItemEventArgs e)
{
this.checkBox.ToggleStateChanged -= new StateChangedEventHandler(checkBox_ToggleStateChanged);
ToggleState checkState = ToggleState.Off;
for (int i = 0; i < this.radListView1.Items.Count; i++)
{
if (i == 0)
{
checkState = this.radListView1.Items[0].CheckState;
}
else if (this.radListView1.Items[i].CheckState != this.radListView1.Items[i - 1].CheckState)
{
checkState = ToggleState.Indeterminate;
break;
}
}
this.checkBox.ToggleState = checkState;
this.checkBox.ToggleStateChanged += new StateChangedEventHandler(checkBox_ToggleStateChanged);
this.radListView1.ListViewElement.SynchronizeVisualItems();
}
private RadCheckBoxElement checkBox;
public RadForm1()
{
InitializeComponent();
this.radListView1.DataSource = this.productsBindingSource;
this.radListView1.ViewType = ListViewType.DetailsView;
this.radListView1.ShowCheckBoxes = true;
this.checkBox = new RadCheckBoxElement();
this.checkBox.Margin = new Padding(0, 10, 0, 0);
this.checkBox.ToggleStateChanged += new StateChangedEventHandler(checkBox_ToggleStateChanged);
this.radListView1.ItemCheckedChanged += new ListViewItemEventHandler(radListView1_ItemCheckedChanged);
this.checkBox.ZIndex = 1000;
this.checkBox.Alignment = ContentAlignment.TopLeft;
this.checkBox.StretchHorizontally = this.checkBox.StretchVertically = false;
this.checkBox.IsThreeState = true;
this.radListView1.ListViewElement.Children.Add(this.checkBox);
}
private void checkBox_ToggleStateChanged(object sender, StateChangedEventArgs args)
{
if (this.checkBox.ToggleState == ToggleState.Indeterminate)
{
this.checkBox.ToggleState = ToggleState.Off;
return;
}
this.radListView1.BeginUpdate();
this.radListView1.ItemCheckedChanged -= new ListViewItemEventHandler(radListView1_ItemCheckedChanged);
foreach (ListViewDataItem item in this.radListView1.Items)
{
item.CheckState = this.checkBox.ToggleState;
}
this.radListView1.EndUpdate();
this.radListView1.ItemCheckedChanged += new ListViewItemEventHandler(radListView1_ItemCheckedChanged);
}
private void radListView1_ItemCheckedChanged(object sender, ListViewItemEventArgs e)
{
this.checkBox.ToggleStateChanged -= new StateChangedEventHandler(checkBox_ToggleStateChanged);
ToggleState checkState = ToggleState.Off;
for (int i = 0; i < this.radListView1.Items.Count; i++)
{
if (i == 0)
{
checkState = this.radListView1.Items[0].CheckState;
}
else if (this.radListView1.Items[i].CheckState != this.radListView1.Items[i - 1].CheckState)
{
checkState = ToggleState.Indeterminate;
break;
}
}
this.checkBox.ToggleState = checkState;
this.checkBox.ToggleStateChanged += new StateChangedEventHandler(checkBox_ToggleStateChanged);
this.radListView1.ListViewElement.SynchronizeVisualItems();
}