Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DataGridViews排序VB.Net_Vb.net_Sorting_Datagridview - Fatal编程技术网

DataGridViews排序VB.Net

DataGridViews排序VB.Net,vb.net,sorting,datagridview,Vb.net,Sorting,Datagridview,所以我有一个我似乎无法克服的问题。我对我的Datagrid视图应用排序,如下所示。(我可以在CoulmunHeaderMouseClick事件中手动执行此操作,或允许自动执行此操作,但为清楚起见,我已包含手动步骤) 现在问题来了。编辑/向DGV添加行后,该行将自动排序。我希望排序被禁用,并使其不“捕捉”到其排序位置 是否有一种方法可以在CellEndEdit事件中禁用列的排序,以便仅在单击列的标题时应用排序 示例(在列2上应用ASC排序) col1 | col2 a | 1 b | 2 c |

所以我有一个我似乎无法克服的问题。我对我的Datagrid视图应用排序,如下所示。(我可以在CoulmunHeaderMouseClick事件中手动执行此操作,或允许自动执行此操作,但为清楚起见,我已包含手动步骤)

现在问题来了。编辑/向DGV添加行后,该行将自动排序。我希望排序被禁用,并使其不“捕捉”到其排序位置

是否有一种方法可以在CellEndEdit事件中禁用列的排序,以便仅在单击列的标题时应用排序

示例(在列2上应用ASC排序)

col1 | col2

a | 1

b | 2


c | 3我刚刚测试了这个,它基本上是有效的

Private Sub DataGridView1_Sorted(sender As Object, e As EventArgs) Handles DataGridView1.Sorted
    Dim currentTable = DirectCast(DataGridView1.DataSource, DataTable)
    Dim newTable = currentTable.DefaultView.ToTable()

    DataGridView1.DataSource = newTable
End Sub

不过,它确实有一些怪癖,这两个怪癖都与排序时当前单元格位于新行有关。我将尝试改进它,但我认为现在值得发布,您或其他人可以在此期间使用它作为更完整解决方案的基础。

我尝试过的方法:将SortMode设置为NotSortable(
DataGridView1.Columns(e.ColumnIndex)。SortMode=DataGridViewColumnSortMode.NotSortable
)尝试使用不同的排序模式清除DGV上的排序(
DataGridView1.sort(DataGridView1.Columns(\u sortedColumnIndex),Nothing)
)。我已经完成了编程和自动排序。下面是我的建议。将数据放入
数据表
,并将其绑定到
数据网格视图
。对网格进行排序后,您应该能够在该
DataTable
DefaultView
上调用
ToTable
,以获得原始
DataTable
的副本,该副本的顺序相同,但未应用排序。然后,您可以将新的
DataTable
绑定到网格,以代替旧的,您应该可以看到您想要的行为。谢谢,我会给您一个演示,并让您知道我是否正确,可能需要修改此abit以刷新原始数据表,因为我在代码的其他部分中使用了该abit。好的,最初它可以工作,但我需要使用新数据表更新原始数据集,以便在维护每个
DataRow
RowState
时保留更改的值,我没有检查,然后,您应该能够简单地使用最终的
DataTable
保存更改。如果没有,您应该能够调用
DataTable.Merge
将最终数据合并回原始的
DataTable
。您好,经过一点修改,我让它工作了。非常感谢你的帮助。基本上在最后,我只是用新的数据表替换我的原始数据源,这样当我保存时,我仍然会保留我的更改。未维护行状态,因为它是一个新表
Dim currentTable As DataTable=DirectCast(DataGridView1.DataSource,DataTable)Dim newTable As DataTable=currentTable.DefaultView.ToTable()DataGridView1.DataSource=newTable _originalDataTable=newTable
当我提到正在维护的
行状态时,我说的是新表中的
RowState
与旧表中相应的行相同。如果您正在保存新表,那么这正是必须发生的事情,在这种情况下这绝对是一件好事。
Private Sub DataGridView1_Sorted(sender As Object, e As EventArgs) Handles DataGridView1.Sorted
    Dim currentTable = DirectCast(DataGridView1.DataSource, DataTable)
    Dim newTable = currentTable.DefaultView.ToTable()

    DataGridView1.DataSource = newTable
End Sub