C# 更改数据源后,为什么DataGridView仅在排序后显示行?

C# 更改数据源后,为什么DataGridView仅在排序后显示行?,c#,winforms,datagridview,oracle12c,C#,Winforms,Datagridview,Oracle12c,我试图从DataTable中填充DataGridView控件,DataTable本身会填充Oracle数据库上sql查询的结果。这应该在双击ListBox控件中的表名后发生 在我第一次双击表名时,这种方式很好,但第二次它只显示列名,不显示行 我发现,基于任何列对DataGridView进行排序都会导致行突然出现,这让我怀疑存在某种图形/渲染故障 这是预期的行为吗 //ListBox的事件处理程序 私有void表\u MouseDoubleClick(对象发送方,MouseEventArgs e)

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

在我第一次双击表名时,这种方式很好,但第二次它只显示列名,不显示行

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

这是预期的行为吗

//ListBox的事件处理程序
私有void表\u MouseDoubleClick(对象发送方,MouseEventArgs e)
{
//tables是一个用表名填充的列表框
int index=this.tables.IndexFromPoint(e.Location);
字符串表名称;
if(index!=System.Windows.Forms.ListBox.NoMatches)
{
//重用数据表
dt.Reset();
table_name=tables.Items[index].ToString();
OracleCommand cmd=新的OracleCommand();
cmd.Connection=con;
//区分大小写
cmd.CommandText=String.Format(@“select*from”“{0}”“,表名);
cmd.CommandType=CommandType.Text;
OracleDataAdapter da=新的OracleDataAdapter(cmd);
da.MissingSchemaAction=MissingSchemaAction.AddWithKey;
da.填充(dt);
dt.TableName=表名称;
label7.Text=表格名称;
//在这种情况下,这三行实际上没有完成任何工作
table.DataSource=null;
table.Rows.Clear();
table.DataSource=dt;
//取消对这些行的注释会产生预期的行为
//DataGridViewColumn c=table.Columns[0];
//表.Sort(c,系统.ComponentModel.ListSortDirection.Descending);
}
}


问题似乎是由
DataTable.Reset
调用引起的


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

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

东西的描述。。。 CSV_IO_实例是一个包含数据表data_表的类。我需要将新的csv数据重新加载到data_表的这个实例中,然后刷新

代码

    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
编辑:

我发现论坛帖子中的一些帖子帮助我朝着正确的方向前进:

编辑X2:

好的,第一个解决方案没有完全起作用。当它删除列标题上的排序图标时,它使列保持排序状态。我在这个链接的帮助下进行了修改:

现在我有了一个工作模型,我正在使用绑定源,因为它具有RemoveSort特性。我调用FLUSH_DGV_和_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

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