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