Maybe I'm setting up the grid the wrong way but what I need to do is to constantly query some external files to build a grid. That isn't the issue per se as I've done that. But every time I rebuild the grid (which is around every 2 seconds) what ever row I had selected and where ever I had scrolled to in the list goes away and I go back to the top of the list.
Every two seconds a BuildGrid procedure is called where the data source is created and assigned to the grid.
Here is a portion of the BuildGrid that I'm referring to:
Every two seconds a BuildGrid procedure is called where the data source is created and assigned to the grid.
Here is a portion of the BuildGrid that I'm referring to:
Private Sub BuildGrid()
Timer1.Stop()
Dim completedJobSource As New BindingSource
While not done
completedJobSource.Add(New CompletedJobs(strGUID, strJobName, strJobDescription, priority))
end while
RadGridView_Completed.DataSource = completedJobSource
Timer.Start
Could it be that the data source is always being created here? It is possible that some of the data rows might not be there the next time which isn't a big deal but I just don't like that the scrolling keeps going to the top. It would also be great to keep the current row selected whatever it was whether the data in it changed or not.
Thanks,
Tim
6 Answers, 1 is accepted
0
Richard Slade
Top achievements
Rank 2
answered on 21 Dec 2010, 11:52 PM
Hi,
The one potential issue I can think if with refreshing the the datasource and keeping the scroll position and selected row is if you are in the middle of scrolling through rows then the grid would still scroll back to another position. Is this acceptable? If so, I will try and put together a small sample for you.
Regards,
Richard
The one potential issue I can think if with refreshing the the datasource and keeping the scroll position and selected row is if you are in the middle of scrolling through rows then the grid would still scroll back to another position. Is this acceptable? If so, I will try and put together a small sample for you.
Regards,
Richard
0
Tim
Top achievements
Rank 1
answered on 22 Dec 2010, 12:03 AM
Thanks. I don't think that's a big deal. And I see there's a "_Scroll" event for the grid so perhaps I can pause the clock or updates while scrolling so no updates occur if that is how that event is triggered.
0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 22 Dec 2010, 10:04 AM
Hi Tim,
Please try this (it's just a radgridview and a timer on a form) and let me know how this is for you.
Hope that helps
Richard
Please try this (it's just a radgridview and a timer on a form) and let me know how this is for you.
Imports System.ComponentModel Imports Telerik.WinControls.Data Imports Telerik.WinControls.UI.Export Public Class Form1 Private m_CurrentRowIndex As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Timer1.Interval = 2000 Me.RadGridView1.Columns.Add("Name") Me.RadGridView1.Columns.Add("Age") Me.Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick BuildGrid() End Sub Private Sub BuildGrid() Me.Timer1.Stop() RemoveHandler RadGridView1.SelectionChanged, AddressOf RadGridView1_SelectionChanged Dim source As New BindingList(Of Person) For i As Integer = 40 To 50 source.Add(New Person("Richard", i)) source.Add(New Person("Fred", i + 2)) source.Add(New Person("Chris", i + 4)) source.Add(New Person("Peter", i + 6)) source.Add(New Person("Stewart", i + 8)) source.Add(New Person("Oliver", i + 10)) source.Add(New Person("Richard", i)) source.Add(New Person("Fred", i + 2)) source.Add(New Person("Chris", i + 4)) source.Add(New Person("Peter", i + 6)) source.Add(New Person("Stewart", i + 8)) source.Add(New Person("Oliver", i + 10)) Next Me.RadGridView1.BeginUpdate() Me.RadGridView1.DataSource = source Me.RadGridView1.EndUpdate() If Me.RadGridView1.RowCount - 1 >= m_CurrentRowIndex Then Me.RadGridView1.Rows(m_CurrentRowIndex).IsCurrent = True Me.RadGridView1.Rows(m_CurrentRowIndex).IsSelected = True If Not Me.RadGridView1.TableElement.IsRowVisible(Me.RadGridView1.Rows(m_CurrentRowIndex)) Then Me.RadGridView1.TableElement.EnsureRowVisible(Me.RadGridView1.Rows(m_CurrentRowIndex)) End If End If AddHandler RadGridView1.SelectionChanged, AddressOf RadGridView1_SelectionChanged Me.Timer1.Start() End Sub Private Sub RadGridView1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadGridView1.SelectionChanged If Me.RadGridView1.CurrentRow.Index > -1 Then Me.m_CurrentRowIndex = Me.RadGridView1.CurrentRow.Index End If End Sub End Class Public Class Person Public Sub New(ByVal name As String, ByVal age As Integer) Me.Name = name Me.Age = age End Sub Public Property Name As String Public Property Age As Integer End ClassHope that helps
Richard
0
Tim
Top achievements
Rank 1
answered on 22 Dec 2010, 07:32 PM
Thanks Richard. That helped. I modified a portion of it slightly to store the vScroll and hScroll values to keep the scroll position yet the selected item remains. The change I made is below for those who might be interested.
In your example if you have filtering turned on and you're typing in a filter in the edit box, do you get an exception during the build? I get them (perhaps at Telerik.WinControls.UI.GridCellElement.get_ViewTemplate() ) during the build (but not when the build is complete). Putting EnableFiltering = False and then True would fix it but it would be pretty ugly as it would continually hide & show. The other option which I'm working on now is just building a custom filter form which if it has values set, will compare when it's time to add data to the source and if it meets the criteria then it gets added to the data source, if not, then it won't. Not as fluent as the built-in filter but it should work in the short term.
One last question - is there a property to just select the row without the 'border' around the column you clicked on? I just want to treat the row as one long piece of data and seeing the column that was clicked isn't really neccessary. Thanks.
-Tim
In your example if you have filtering turned on and you're typing in a filter in the edit box, do you get an exception during the build? I get them (perhaps at Telerik.WinControls.UI.GridCellElement.get_ViewTemplate() ) during the build (but not when the build is complete). Putting EnableFiltering = False and then True would fix it but it would be pretty ugly as it would continually hide & show. The other option which I'm working on now is just building a custom filter form which if it has values set, will compare when it's time to add data to the source and if it meets the criteria then it gets added to the data source, if not, then it won't. Not as fluent as the built-in filter but it should work in the short term.
One last question - is there a property to just select the row without the 'border' around the column you clicked on? I just want to treat the row as one long piece of data and seeing the column that was clicked isn't really neccessary. Thanks.
-Tim
Dim vScroll As Integer = Me.RadGridView_Completed.TableElement.VScrollBar.Value Dim hScroll As Integer = Me.RadGridView_Completed.TableElement.HScrollBar.Value RadGridView_Completed.BeginUpdate() RadGridView_Completed.DataSource = completedJobSource RadGridView_Completed.EndUpdate() If Me.RadGridView_Completed.RowCount - 1 >= m_CurrentRowIndex Then Me.RadGridView_Completed.Rows(m_CurrentRowIndex).IsCurrent = True Me.RadGridView_Completed.Rows(m_CurrentRowIndex).IsSelected = True Me.RadGridView_Completed.TableElement.VScrollBar.Value = vScroll Me.RadGridView_Completed.TableElement.HScrollBar.Value = hScroll 'If Not Me.RadGridView_Completed.TableElement.IsRowVisible(Me.RadGridView_Completed.Rows(m_CurrentRowIndex)) Then ' Me.RadGridView_Completed.TableElement.EnsureRowVisible(Me.RadGridView_Completed.Rows(m_CurrentRowIndex)) 'End If End IfAddHandler RadGridView_Completed.SelectionChanged, AddressOf RadGridView_Completed_SelectionChanged0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 23 Dec 2010, 11:14 AM
Hi,
I'm glad that has helped.
To answer your last question, first set the following property
then subscribe to the ViewCellFormatting event and add the following
Please remember to mark helpful suggestions as answer and if you need anything further just let me know
Richard
I'm glad that has helped.
To answer your last question, first set the following property
Me.RadGridView1.SelectionMode = GridViewSelectionMode.FullRowSelectthen subscribe to the ViewCellFormatting event and add the following
Private Sub RadGridView1_CellFormatting(ByVal sender As System.Object, ByVal e As Telerik.WinControls.UI.CellFormattingEventArgs) Handles RadGridView1.ViewCellFormatting If TypeOf e.CellElement Is GridDataCellElement Or TypeOf e.CellElement.ColumnInfo Is GridViewRowHeaderColumn Then e.CellElement.DrawBorder = False End IfEnd SubPlease remember to mark helpful suggestions as answer and if you need anything further just let me know
Richard
0
Tim
Top achievements
Rank 1
answered on 27 Dec 2010, 07:35 PM
Perfect. Thank you.