Dean Allan
Top achievements
Rank 1
Dean Allan
asked on 13 Feb 2011, 09:52 PM
Hello,
I was hoping someone could shed some light on this situation.
I have a RadPageView with a RadListControl inside. The list control is populated from a sql table that contains potential 'status' setting for a recordset that is filling a RadGridView also on the same page. I have the list control MultiSelect set to 'Simple'. The idea is a fast, multi-select filter for the radgrid.
So as with most issues, 90% works great. Using RadListControl1.SelectedIndexChanged as my event handler I am able to create a filter for the radgrid using OR to allow filtering for multiple status at one time. If the user clicks status 'a' then status 'b' then status 'c' the Radgrid filters and only shows 'A',then adds 'B',then 'C'. Perfect! (status LIKE 'A' or status LIKE 'B' or status LIKE 'C' is the expression I end up with, again perfect)
Here is where is problem lies. When a user un-selects items in the RadListControl in reverse order (Add, A,B,C then Remove C,B,A) things seem to work, the event handler fires properly. However, if the user un-selects items in any other order the event wont fire (Add A,B,C then unselect A,B,C). I'm guessing this is by design. Although I have a loop with a message box showing the RadLIstControl items each time the event fires (for debugging). I don't know if this might have some unseen effect on the control.
So I am wondering, is there a solution for this situation, either using the RadListControl (it's fast) or would there be a better method, I just can't seem to get my head around this one. My code is in VB if that matters.
Thanks in advance!
Dean.
I was hoping someone could shed some light on this situation.
I have a RadPageView with a RadListControl inside. The list control is populated from a sql table that contains potential 'status' setting for a recordset that is filling a RadGridView also on the same page. I have the list control MultiSelect set to 'Simple'. The idea is a fast, multi-select filter for the radgrid.
So as with most issues, 90% works great. Using RadListControl1.SelectedIndexChanged as my event handler I am able to create a filter for the radgrid using OR to allow filtering for multiple status at one time. If the user clicks status 'a' then status 'b' then status 'c' the Radgrid filters and only shows 'A',then adds 'B',then 'C'. Perfect! (status LIKE 'A' or status LIKE 'B' or status LIKE 'C' is the expression I end up with, again perfect)
Here is where is problem lies. When a user un-selects items in the RadListControl in reverse order (Add, A,B,C then Remove C,B,A) things seem to work, the event handler fires properly. However, if the user un-selects items in any other order the event wont fire (Add A,B,C then unselect A,B,C). I'm guessing this is by design. Although I have a loop with a message box showing the RadLIstControl items each time the event fires (for debugging). I don't know if this might have some unseen effect on the control.
So I am wondering, is there a solution for this situation, either using the RadListControl (it's fast) or would there be a better method, I just can't seem to get my head around this one. My code is in VB if that matters.
Thanks in advance!
Dean.
8 Answers, 1 is accepted
0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 14 Feb 2011, 12:59 AM
Hi Dean,
Here's another way. Subscribe to the RadPropertyChanged for each item and capture the selected propert
Hope that helps
Richard
Here's another way. Subscribe to the RadPropertyChanged for each item and capture the selected propert
For Each item As RadListDataItem In Me.RadListControl1.Items AddHandler item.RadPropertyChanged, AddressOf RadListControl_RadPropertyChanged NextPrivate Sub RadListControl_RadPropertyChanged(ByVal sender As Object, ByVal e As RadPropertyChangedEventArgs) If e.Property.Name = "Selected" Then Dim item As RadListDataItem = CType(sender, RadListDataItem) MessageBox.Show(item.Text & " is selected: " & item.Selected.ToString()) End IfEnd SubHope that helps
Richard
0
Dean Allan
Top achievements
Rank 1
answered on 15 Feb 2011, 06:38 AM
Hi Richard,
Thanks for the input.
Just so I know, based on what I see, the first snippet manually adds an event handler to each item in the ListControl on the form load. The second is the Sub that gets called. I notice there isn't a 'handles' in the sub, I guess this isn't necessary since the event handler is called directly?
So far your suggestion is working well. I noticed the selecteditems.count() isn't accurate at the time this event fires though; for example, I show a count of 2 when I have one selected. I can figure out a workaround but is there another method related to your solution to iterate the selected collection?
Thanks again!
Dean.
Here is an example of the code I am working on. I rem'ed out the the loop that wasn't working for debugging. I tried both 1 and 0 for the loop.
Thanks for the input.
Just so I know, based on what I see, the first snippet manually adds an event handler to each item in the ListControl on the form load. The second is the Sub that gets called. I notice there isn't a 'handles' in the sub, I guess this isn't necessary since the event handler is called directly?
So far your suggestion is working well. I noticed the selecteditems.count() isn't accurate at the time this event fires though; for example, I show a count of 2 when I have one selected. I can figure out a workaround but is there another method related to your solution to iterate the selected collection?
Thanks again!
Dean.
Here is an example of the code I am working on. I rem'ed out the the loop that wasn't working for debugging. I tried both 1 and 0 for the loop.
Private Sub RadListControl_RadPropertyChanged(ByVal sender As Object, ByVal e As RadPropertyChangedEventArgs) If e.Property.Name = "Selected" Then 'Dim x As Integer Dim item As RadListDataItem = CType(sender, RadListDataItem) ' MessageBox.Show(item.Text & " is selected: " & item.Selected.ToString()) Me.RadGridView1.FilterDescriptors.Clear() Me.RadGridView1.FilterDescriptors.LogicalOperator = FilterLogicalOperator.Or ' For x = 1 To Me.RadListControl1.SelectedItems.Count() MsgBox(RadListControl1.SelectedItems.Count()) Me.RadGridView1.FilterDescriptors.Add("status", FilterExpression.BinaryOperation.[OR], item.Text) ' Next End If End Sub0
Richard Slade
Top achievements
Rank 2
answered on 15 Feb 2011, 08:57 AM
Hi Dean,
No, you don't need a Handler for those that have had an event handler manually added.
The reason that the items count seems incorrect on the de-selection is because when you message out the selection the prioperty has changed but appear still to be selected.
You can get over this with the following
Declare a private int
Hope thast helps but let me know if you need anything else
Richard
No, you don't need a Handler for those that have had an event handler manually added.
The reason that the items count seems incorrect on the de-selection is because when you message out the selection the prioperty has changed but appear still to be selected.
You can get over this with the following
Declare a private int
Private m_ItemsCount As Integer = 0Private Sub RadListControl_RadPropertyChanged(ByVal sender As Object, ByVal e As RadPropertyChangedEventArgs) If e.Property.Name = "Selected" Then If CType(sender, RadListDataItem).Selected Then m_ItemsCount = m_ItemsCount + 1 Else m_ItemsCount = m_ItemsCount - 1 End If MessageBox.Show(m_ItemsCount.ToString()) End IfEnd SubHope thast helps but let me know if you need anything else
Richard
0
Dean Allan
Top achievements
Rank 1
answered on 15 Feb 2011, 12:20 PM
Hey Richard,
That did make the count correct but I still keep hitting a brick wall.
Let me ask this; What is the best way to add/remove a filter to a datagrid using a ListControl with multiple simple select?
Thanks again for the assistance!
Dean.
This is what I have so far but it seems the event is called several times and i am at a loss.
That did make the count correct but I still keep hitting a brick wall.
Let me ask this; What is the best way to add/remove a filter to a datagrid using a ListControl with multiple simple select?
Thanks again for the assistance!
Dean.
This is what I have so far but it seems the event is called several times and i am at a loss.
Private Sub RadListControl_RadPropertyChanged(ByVal sender As Object, ByVal e As RadPropertyChangedEventArgs) Me.RadGridView1.FilterDescriptors.Clear() ' i assumed this sub was only called once per click. This clears the filter and rebuilds it's rather than pop items on and off. If CType(sender, RadListDataItem).Selected Then Dim item As RadListDataItem = CType(sender, RadListDataItem) Me.RadGridView1.FilterDescriptors.LogicalOperator = FilterLogicalOperator.Or Me.RadGridView1.FilterDescriptors.Add("status", FilterExpression.BinaryOperation.[OR], Me.RadListControl1.SelectedItems.Item(x).ToString) End IfEnd Sub0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 15 Feb 2011, 01:34 PM
Hi Dean,
Ok, I've put togeether a small sample for you. I think in this case it's best to use Custom Filtering and I've also changed slightly the handler to pick up the click event rather than the RadPropertyChanged. All seems to work fine but let me know if you have any questions
Designer File
Form1.vb
and here is a small video of it working
Hope that helps
Richard
Ok, I've put togeether a small sample for you. I think in this case it's best to use Custom Filtering and I've also changed slightly the handler to pick up the click event rather than the RadPropertyChanged. All seems to work fine but let me know if you have any questions
Designer File
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Partial Class Form1 Inherits System.Windows.Forms.Form 'Form overrides dispose to clean up the component list. <System.Diagnostics.DebuggerNonUserCode()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) Try If disposing AndAlso components IsNot Nothing Then components.Dispose() End If Finally MyBase.Dispose(disposing) End Try End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> _ Private Sub InitializeComponent() Dim RadListDataItem1 As Telerik.WinControls.UI.RadListDataItem = New Telerik.WinControls.UI.RadListDataItem() Dim RadListDataItem2 As Telerik.WinControls.UI.RadListDataItem = New Telerik.WinControls.UI.RadListDataItem() Dim RadListDataItem3 As Telerik.WinControls.UI.RadListDataItem = New Telerik.WinControls.UI.RadListDataItem() Dim RadListDataItem4 As Telerik.WinControls.UI.RadListDataItem = New Telerik.WinControls.UI.RadListDataItem() Dim RadListDataItem5 As Telerik.WinControls.UI.RadListDataItem = New Telerik.WinControls.UI.RadListDataItem() Me.RadListControl1 = New Telerik.WinControls.UI.RadListControl() Me.RadGridView1 = New Telerik.WinControls.UI.RadGridView() CType(Me.RadListControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RadGridView1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' 'RadListControl1 ' Me.RadListControl1.CaseSensitiveSort = True Me.RadListControl1.Dock = System.Windows.Forms.DockStyle.Left RadListDataItem1.Text = "Available" RadListDataItem1.TextWrap = True RadListDataItem2.Text = "Unavailable" RadListDataItem2.TextWrap = True RadListDataItem3.Text = "Busy" RadListDataItem3.TextWrap = True RadListDataItem4.Text = "Meeting" RadListDataItem4.TextWrap = True RadListDataItem5.Text = "Holiday" RadListDataItem5.TextWrap = True Me.RadListControl1.Items.Add(RadListDataItem1) Me.RadListControl1.Items.Add(RadListDataItem2) Me.RadListControl1.Items.Add(RadListDataItem3) Me.RadListControl1.Items.Add(RadListDataItem4) Me.RadListControl1.Items.Add(RadListDataItem5) Me.RadListControl1.Location = New System.Drawing.Point(0, 0) Me.RadListControl1.Name = "RadListControl1" Me.RadListControl1.Size = New System.Drawing.Size(120, 282) Me.RadListControl1.TabIndex = 0 Me.RadListControl1.Text = "RadListControl1" ' 'RadGridView1 ' Me.RadGridView1.Dock = System.Windows.Forms.DockStyle.Fill Me.RadGridView1.Location = New System.Drawing.Point(120, 0) Me.RadGridView1.Name = "RadGridView1" Me.RadGridView1.Size = New System.Drawing.Size(204, 282) Me.RadGridView1.TabIndex = 0 Me.RadGridView1.Text = "RadGridView1" ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(324, 282) Me.Controls.Add(Me.RadGridView1) Me.Controls.Add(Me.RadListControl1) Me.Name = "Form1" Me.Text = "Form1" CType(Me.RadListControl1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.RadGridView1, System.ComponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False) End Sub Friend WithEvents RadListControl1 As Telerik.WinControls.UI.RadListControl Friend WithEvents RadGridView1 As Telerik.WinControls.UI.RadGridView End ClassForm1.vb
Imports System.ComponentModel Imports Telerik.WinControls.UI Imports Telerik.WinControls Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim list As New BindingList(Of MyStatus) list.Add(New MyStatus("Richard", "Available")) list.Add(New MyStatus("Bob", "Holiday")) list.Add(New MyStatus("Chris", "Holiday")) list.Add(New MyStatus("Stew", "Unavailable")) list.Add(New MyStatus("Pete", "Busy")) list.Add(New MyStatus("Ester", "Busy")) list.Add(New MyStatus("Harriet", "Meeting")) list.Add(New MyStatus("Leisl", "Available")) list.Add(New MyStatus("Tonia", "Busy")) Me.RadGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill Me.RadGridView1.EnableFiltering = True Me.RadGridView1.ShowFilteringRow = False Me.RadGridView1.EnableCustomFiltering = True Me.RadListControl1.SelectionMode = SelectionMode.MultiSimple Me.RadGridView1.DataSource = list For Each item As RadListDataItem In Me.RadListControl1.Items AddHandler item.VisualItem.Click, AddressOf RadListControl1_ItemClick Next End Sub Private Sub RadListControl1_ItemClick(ByVal sender As Object, ByVal e As EventArgs) Me.RadGridView1.MasterTemplate.Refresh() End Sub Private Sub RadGridView1_CustomFiltering(ByVal sender As System.Object, ByVal e As Telerik.WinControls.UI.GridViewCustomFilteringEventArgs) Handles RadGridView1.CustomFiltering If Me.RadListControl1.SelectedItems.Count = 0 Then e.Visible = True Return End If e.Visible = False Dim found As Boolean For Each item As RadListDataItem In Me.RadListControl1.SelectedItems If String.Equals(item.Text, e.Row.Cells("Status").Value.ToString()) Then found = True Exit For End If Next e.Visible = found End Sub End Class Public Class MyStatus Public Sub New(ByVal name As String, ByVal status As String) Me.Name = name Me.Status = status End Sub Public Property Name As String Public Property Status As StringEnd Classand here is a small video of it working
Hope that helps
Richard
0
Dean Allan
Top achievements
Rank 1
answered on 16 Feb 2011, 03:55 AM
Hey Richard,
Thanks again for the assistance. The last example was great!
I decided with a hybrid of your original offering. I like the filter method for RadGrid I was using (mainly because I understood it), it was the functionality of standard listcontrol event handler that was holding me up.
Your first example really solved the problem. It provided me with an accurate representation of the events going on with the listcontrol. Taking that data, I created a second Sub that will handle popping the stack (an array) and then i'll build a new set of filters. It's a bit old school but should do the trick. It also let's me add other fields besides status to the filters.
Something like this.
Thanks again,
Dean.
Thanks again for the assistance. The last example was great!
I decided with a hybrid of your original offering. I like the filter method for RadGrid I was using (mainly because I understood it), it was the functionality of standard listcontrol event handler that was holding me up.
Your first example really solved the problem. It provided me with an accurate representation of the events going on with the listcontrol. Taking that data, I created a second Sub that will handle popping the stack (an array) and then i'll build a new set of filters. It's a bit old school but should do the trick. It also let's me add other fields besides status to the filters.
Something like this.
Private Sub RadListControl_RadPropertyChanged(ByVal sender As Object, ByVal e As RadPropertyChangedEventArgs) If e.Property.Name = "Selected" Then Dim item As RadListDataItem = CType(sender, RadListDataItem) ModifyFilter(item.Text, item.Selected.ToString(),"status") End If End Sub Private Sub ModifyFilter(ByVal status As String, ByVal action As String, ByVal field as String) If action = "True" Then MsgBox("Add " & status) ' for debugging only 'add to the stack Else MsgBox("Remove " & status) ' for debugging only 'pop the stack End If 'clear and rebuild the filters from the stack. End SubThanks again,
Dean.
0
Dean Allan
Top achievements
Rank 1
answered on 16 Feb 2011, 04:48 AM
Hey Richard,
Here is my final code I came up with. So far it seems to work. Thanks again, couldn't have gotten this far without your help!
Here is my final code I came up with. So far it seems to work. Thanks again, couldn't have gotten this far without your help!
Private Sub RadListControl_RadPropertyChanged(ByVal sender As Object, ByVal e As RadPropertyChangedEventArgs) If e.Property.Name = "Selected" Then Dim item As RadListDataItem = CType(sender, RadListDataItem) ModifyFilter(item.Text, item.Selected.ToString()) End If End Sub Private Sub ModifyFilter(ByVal newstatus As String, ByVal newaction As String) If newaction = "True" Then Me.RadGridView1.FilterDescriptors.LogicalOperator = FilterLogicalOperator.Or Me.RadGridView1.FilterDescriptors.Add("status", FilterExpression.BinaryOperation.[OR], newstatus) Else For Each FilterExpression In RadGridView1.FilterDescriptors If FilterExpression.Value = newstatus Then Me.RadGridView1.FilterDescriptors.Remove(FilterExpression) Exit For End If Next If RadGridView1.FilterDescriptors.Count = 0 Then ' check to see if all the filters are gone then clear if so. RadGridView1.FilterDescriptors.Clear() End If End If End Sub0
Richard Slade
Top achievements
Rank 2
answered on 16 Feb 2011, 08:42 AM
Hi Dean,
Glad that you have this all sorted now. I'm glad i could help. It's also good to get some feedback and see your final version. Nothing wrong with it, but do have a look at the demos on your PC too for the Custom Filtering. The custom filtering is quite simple but powerful and is really useful for these situations which you may find useful in the future. Anyway, glad you have it all working now.
All the best
Richard
Glad that you have this all sorted now. I'm glad i could help. It's also good to get some feedback and see your final version. Nothing wrong with it, but do have a look at the demos on your PC too for the Custom Filtering. The custom filtering is quite simple but powerful and is really useful for these situations which you may find useful in the future. Anyway, glad you have it all working now.
All the best
Richard