【问题标题】:After changing DataSource, why does DataGridView show rows only after sorting?更改DataSource后,为什么DataGridView排序后才显示行?
【发布时间】:2016-09-03 01:38:52
【问题描述】:

我正在尝试从 DataTable 中填充 DataGridView 控件,该控件本身填充了 Oracle 数据库上的 sql 查询结果。这应该在从 ListBox 控件中双击表名后发生。

第一次双击表名时效果很好,但第二次它只会显示列名而没有行。

我发现,根据任何列对 DataGridView 进行排序会导致行突然出现,这让我怀疑某种图形/渲染故障。

这是预期的行为吗?

// 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)

【问题讨论】:

  • 好奇:你为什么不选择更简单的版本:table_name = tables.SelectedItem.ToString(); 你是否禁用了列表框?你试过table.Refresh()吗?
  • @TaW 感谢您的建议。我确实尝试了 Refresh()、Update() 和其他方法,但排序似乎是唯一有效的方法。此外,ListBox 始终处于启用状态,以便可以选择后续表。
  • 嗯,这听起来很奇怪;我确定一定有其他事情发生..您设置的 DGV 的任何其他属性?虚拟模式?
  • 尝试使用 BindingSource。 BindingSource source = new BindingSource(); source.DataSource = dt dataGridView.Datasource = source;
  • 我确实将 Visible 和 Enabled 设置为 false,并且仅在连接到数据库后才将它们设置为 true,但它的行为方式相同。 AutoGenerateColumns 默认设置为 true。我将尝试使用已排序的行,因为排序不会影响 DataTable。

标签: c# winforms datagridview oracle12c


【解决方案1】:

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

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

【讨论】:

  • 是的 dt = new DataTable(); 而不是 dt.Reset() 成功了。谢谢。
【解决方案2】:

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

物品描述... CSV_IO_INSTANCE 是一个包含数据表 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

编辑:

我发现此论坛帖子中的一些帖子帮助我朝着正确的方向前进: 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:

好的,第一个解决方案没有完全奏效。虽然它删除了列标题上的排序图标,但它使列排序。我在此链接的一些帮助下对其进行了重新设计: 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 然后我重新填充我的数据表然后我调用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-08-03
    • 1970-01-01
    • 2021-06-01
    • 2013-12-24
    • 2018-05-20
    相关资源
    最近更新 更多