TSFLLC
asked on
Perform Find using Dataview in Datagridview without using a For Loop
I have a form that contains a dataviewgrid that can contain a large number of rows. The sort on the dataview is preset and can also be modified by a pre-defined set of sorts in a dropdown.
The thing I would like to be able to incorporate into this form is a text box where the user can enter a value associated with the FIRST FIELD in the sort order. At the same time if the sort order contains multiple fields, can I perform a find as I've included common code below to locate the first occurance of the first field in the sort? I specifically need to be able to move the pointer to this row (glCurrentRow) so that a double-click will allow me to get an ID field hidden in the dataviewgrid.
The thing I would like to be able to incorporate into this form is a text box where the user can enter a value associated with the FIRST FIELD in the sort order. At the same time if the sort order contains multiple fields, can I perform a find as I've included common code below to locate the first occurance of the first field in the sort? I specifically need to be able to move the pointer to this row (glCurrentRow) so that a double-click will allow me to get an ID field hidden in the dataviewgrid.
Dim i As Int64 = 0, vals(1) As Object
vals(0) = Convert.ToInt64(txtIndex.Text)
vals(1) = glInvoiceAssessment
i = dvGlobalDuesInvoices.Find(vals)
If i >= 0 Then
glCurrentInvoiceAssessmentEntryRow = i
glCurrentRow = i
Else
glCurrentInvoiceAssessmentEntryRow = 0
glCurrentRow = 0
End If
ASKER
I can't because the code above populates the glCurrentRow variable which is used with MoveNext / MovePrevious subs on the Entry form. This variable is critical.
The user is able to click a Browse button on the entry form which opens a form with a datagridview using the same datatable. However, the user is able to change the sort order with a dropdown that may have 3-4 option sort orders. Then the user double-clicks on the row (activating and repopulating the Entry form) and because of the MoveNext/Previous buttons on the entry form, I must be able to maintain a current row with the COMPLETE datatable.
But the main issue is wanting to just stop at the first instance of a value in the first field in a sort.
The user is able to click a Browse button on the entry form which opens a form with a datagridview using the same datatable. However, the user is able to change the sort order with a dropdown that may have 3-4 option sort orders. Then the user double-clicks on the row (activating and repopulating the Entry form) and because of the MoveNext/Previous buttons on the entry form, I must be able to maintain a current row with the COMPLETE datatable.
But the main issue is wanting to just stop at the first instance of a value in the first field in a sort.
You want to maintain the selected row after the sort ? Is that it ?
Check this workaround:
Option Strict On
Public Class Form1
Private currentRowID As Integer
' looks for the index of the ID
Function getDGindex(ByVal ID As Integer) As Integer
Dim dr As DataGridViewRow
For Each dr In DataGridView1.Rows
If CType(dr.Cells(0).Value, Integer) = ID Then
Return dr.Index
End If
Next
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim rnd As New Random
Dim dt As New DataTable
dt.Columns.Add("ID", GetType(Byte))
dt.Columns.Add("Description", GetType(String))
dt.Columns.Add("Random", GetType(Integer))
Dim dr As DataRow
For x As Byte = 0 To 100
dr = dt.NewRow
dr("ID") = x
dr("Description") = "Item" & x.ToString.PadLeft(3, "0"c)
dr("Random") = rnd.Next(0, 1000)
dt.Rows.Add(dr)
Next
Me.DataGridView1.DataSource = dt
Me.DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End Sub
' On row leave detects the select ID and stores it on currentRowID
Private Sub DataGridView1_RowLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.RowLeave
If e.RowIndex <> -1 And Not Me.DataGridView1.Rows(e.RowIndex).IsNewRow Then
currentRowID = CType(Me.DataGridView1(0, e.RowIndex).Value, Integer)
End If
End Sub
' After sort is selects again the selected item
Private Sub DataGridView1_Sorted(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.Sorted
Dim index As Integer = getDGindex(currentRowID)
Me.DataGridView1.CurrentCell = Me.DataGridView1.Rows(index).Cells(0)
End Sub
End Class
ASKER
>> You want to maintain the selected row after the sort ? Is that it ?
Yes.
As I specified in the Title.....Without a For Loop
I can have upwards of 40-50 thousand records in this datagridview. Haven't tested it but I would think using a Loop with this many rows would be pathetic in terms of speed/efficiency. But I'll check it out just to see.
Yes.
As I specified in the Title.....Without a For Loop
I can have upwards of 40-50 thousand records in this datagridview. Haven't tested it but I would think using a Loop with this many rows would be pathetic in terms of speed/efficiency. But I'll check it out just to see.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Prefer not to loop but this does work appropriately.
http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx