为什么改DataSource后DataGridView只显示排序后的行?

After changing DataSource, why does DataGridView show rows only after sorting?

我正在尝试从 DataTable 填充 DataGridView 控件,它本身填充了对 Oracle 数据库的 sql 查询的结果。在列表框控件中双击 table 名称后应该会发生这种情况。

我第一次双击 table 名称时效果很好,但第二次它只显示列名而不显示行。

我发现,根据任何列对 DataGridView 进行排序都会导致行突然出现,这让我怀疑是某种 graphical/rendering 故障。

这是预期的行为吗?

// event handler for ListBox
private void tables_MouseDoubleClick(object sender, MouseEventArgs e)    
{
    // tables is a ListBox populated with table names
    int index = this.tables.IndexFromPoint(e.Location);     
    String table_name;
    if (index != System.Windows.Forms.ListBox.NoMatches)
    {
        // reusing the DataTable
        dt.Reset();     
        table_name =tables.Items[index].ToString();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = con;
        // case sensitive
        cmd.CommandText = String.Format(@"select * from ""{0}""",table_name);
        cmd.CommandType = CommandType.Text;
        OracleDataAdapter da = new OracleDataAdapter(cmd);
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        da.Fill(dt);
        dt.TableName = table_name;
        label7.Text = table_name;
        // these three lines don't actually accomplish anything in this case
        table.DataSource = null;    
        table.Rows.Clear();
        table.DataSource = dt;

        // uncommenting these lines produces the expected behavior 
        //DataGridViewColumn c = table.Columns[0];      
        //table.Sort(c,System.ComponentModel.ListSortDirection.Descending);
    }
}

After second double-click(without sorting)

After second double-click(with sorting)

看起来问题是由 DataTable.Reset 调用引起的。

虽然这不是您的代码问题(很可能是 DataTableDataView 中的错误),但我建议使用 Clear 方法而不是 Reset 或创建一个新 DataTable 个实例。

我有同样的问题,但使用 VBA。附上我的解决方案。

内容描述... CSV_IO_INSTANCE 是一个 class,里面有一个数据 table DATA_TABLE。我需要将新的 csv 数据重新加载到 DATA_TABLE 的这个实例中,然后刷新。

代码...

    Private Sub SHARED_CREATE_DATA_TABLE()
    Try
        DATA_GRID_VIEW_CSV_IO.DataSource = CSV_IO_INSTANCE.DATA_TABLE
        '^BIND DGV TO LOCAL INSTANCE OF THE CSV_IO TABLE.
        '--------------------------------------------------------------------------------------
        'BUG FIX 011 - SEE BUG_FIX_LOG.txt FOR DOCUMENTATION.
        Dim COLUMN_BUG_FIX As DataGridViewColumn = DATA_GRID_VIEW_CSV_IO.Columns(0)
        '^CREATE A COLUMN TO DO BUG FIX ON.
        COLUMN_BUG_FIX.SortMode = DataGridViewColumnSortMode.NotSortable
        '^CHANGE ITS SORT MODE.
        DATA_GRID_VIEW_CSV_IO.Sort(COLUMN_BUG_FIX, System.ComponentModel.ListSortDirection.Ascending)
        '^SORT.
        DATA_GRID_VIEW_CSV_IO.Sort(COLUMN_BUG_FIX, System.ComponentModel.ListSortDirection.Descending)
        '^JUST ONE SORT WONT DO IT.
        COLUMN_BUG_FIX.SortMode = DataGridViewColumnSortMode.Automatic
        '^CHANGE BACK TO AUTO SORT TO GET RID OF THAT SORT ARROW IN THE COLUMN HEADER.
        '--------------------------------------------------------------------------------------
    Catch EXCEPTION As Exception
        CSV_IO_INSTANCE.LOG.WRITE_LINE("Exception in the SHARED_CREATE_DATA_TABLE subroutine.", EXCEPTION)
        '^WRITE ERROR MESSAGE TO THE EVENT_LOG INSTANCE (LOG) IN THE CSV_IO INSTANCE.
    End Try
End Sub

编辑:

我在这个论坛中找到了一些 post 帮助引导我朝着正确的方向前进: https://social.msdn.microsoft.com/Forums/windows/en-US/16398f0c-9687-42aa-8678-e742a43c00c5/reset-the-sort-status-after-reloading-a-datagridview?forum=winformsdatacontrols

编辑 X2:

好的,第一个解决方案没有完全奏效。虽然它删除了列 header 上的排序图标,但它使该列保持排序状态。我在这个 link 的帮助下重新设计了它: https://social.msdn.microsoft.com/Forums/vstudio/en-US/1a9350da-3575-4f79-b708-4277e4d6a240/how-to-force-datagridview-back-to-an-unsorted-state?forum=vbgeneral

现在我有了一个工作模型,我正在使用绑定源,因为它具有 RemoveSort 功能。我调用 FLUSH_DGV_AND_BS 然后我重新填充我的数据 table 然后我调用 BIND_DGV_TO_BS 并且效果很好。

Private Sub BIND_DGV_TO_BS()
    BINDING_SOURCE.DataSource = CSV_IO_INSTANCE.DATA_TABLE
    '^BIND DATASET TO THE INSTANCES DATA TABLE
    DATA_GRID_VIEW_CSV_IO.DataSource = BINDING_SOURCE
    'BUG FIX 011 - SEE BUG_FIX_LOG.txt FOR DOCUMENTATION.--------------------------------------
    Dim COLUMN_BUG_FIX As DataGridViewColumn = DATA_GRID_VIEW_CSV_IO.Columns(0)
    '^CREATE A COLUMN TO DO BUG FIX ON.
    DATA_GRID_VIEW_CSV_IO.Sort(COLUMN_BUG_FIX, System.ComponentModel.ListSortDirection.Ascending)
    '^SORT IN ORDER TO CAUSE THE BUG TO GO AWAY.
    BINDING_SOURCE.RemoveSort()
    '^THEN REMOVE THE SORT TO PUT IT BACK TO ITS RAW DATA VIEW.
    '------------------------------------------------------------------------------------------
End Sub
Private Sub FLUSH_DGV_AND_BS()
    With BINDING_SOURCE
        .DataSource = Nothing
        '^REMOVE THE PREVIOUS BINDINGS.
    End With
    CSV_IO_INSTANCE.DATA_TABLE.Clear()
    '^CLEAR OUT THE DATA TABLE.
End Sub