我有一段代码循环显示第二个DataGridView
,尝试匹配用户与之交互的主DataGridVew
中的相同索引号:
Private Sub AllegationsDataGridView_CellEnter(sender As Object, e As EventArgs) Handles AllegationsDataGridView.CellEnter
Try
Dim currentcolumn As DataGridViewColumn =
AllegationsDataGridView.Columns(AllegationsDataGridView.CurrentCell.ColumnIndex)
For Each row As DataGridViewRow In parentgrid.Rows
If row.Cells.Item(0).Value = AllegationsDataGridView.CurrentRow.Cells(0).Value Then
parentgrid.CurrentCell = parentgrid(0, row.Index)
End If
Next
Catch ex As Exception
Debug.Print(ex.Message)
End Try
endsub:
End Sub
问题是数据源可能有成千上万的条目,我不希望这个循环遍历整个行,直到找到匹配为止。我想知道是否有更快的方法来解决这个问题?我在搜索全部时看到的唯一示例使用For Each Row
方法或Loop Until
方法,这仍然会出现同样的问题。
答案 0 :(得分:0)
我建议您在使用数据源初始化datagridview时构建一个字典,使行键(AllegationsDataGridView.CurrentRow.Cells(0).Value
)与parentGrid
中的行索引相对应。使用数据源而不是数据网格来构建此字典。
您将能够快速访问相应的行。
答案 1 :(得分:0)
来自评论:They both use the same datasource
我不确定为什么用户不与交互的DGV需要让CurrentCell
保持同步,因为如果它们绑定到同一数据源,则可以看到对A的更改B马上。尽管如此:
Private Sub dgv1_CellClick(sender As Object,
e As DataGridViewCellEventArgs) Handles dgv1.CellContentClick
If dgv2.Rows.Count = 0 Then Exit Sub
dgv2.CurrentCell = dgv2.Rows(e.RowIndex).Cells(e.ColumnIndex)
End Sub
在这里,dgv1
是用户网格,dgv2是另一个("父"在你的代码中?)。
如果共享DS,则不需要For / Each迭代,因为每行和每列索引都有相同的数据。即使用户重新排序列也会有效,因为列索引保持不变,只是内部DisplayIndex
更改。
这使用DataGridViewCellEventArgs
中的行索引和列索引来设置CurrentCell
。当Exit Sub
可能有行而不是另一行时,CellContentClick
会占用。
您可能想玩哪个事件来回复。 CellEnter
似乎最不实用:如果他们点击任何单元格空格,它就不会触发。如果可以单击父/ dgv2网格中的单元格,它也会崩溃。如果他们直接点击dgv2,CellClick
也会崩溃。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion){
case 3:{
int jobid = insertJobWithoutClosing(new Job("Default", Color.rgb(0, 0, 255)), db);
db.execSQL("ALTER TABLE " + workTable + " ADD COLUMN " + colJobID + " INTEGER DEFAULT " + jobid + " FOREIGN KEY("+colJobID+") REFERENCES "+table_jobs+"("+job_ID+")");
}
}
似乎工作正常,但在他们同步之前有一点点延迟。