我有一个事件在树视图节点点击时触发,然后创建一个datagridview并将其添加到面板:
void tvd_NodeClickEvent(double animal, string experiment, string pluginIdentifier)
{
DataGridDisplay dgv = new DataGridDisplay(panel4);
dgv.addDatagrid(animal, experiment, pluginIdentifier);
}
我尝试通过执行以下操作删除旧的数据网格:
panel4.Controls.Remove(datagrid);
panel4.Invalidate();
然后添加新的datagrid:
panel4.Controls.Add(datagrid);
问题是,数据网格在没有移除旧网格的情况下将自己绘制在彼此之上?有什么想法吗?
感谢。
编辑:添加额外代码
void ConfigureDatagrid()
{
datagrid.Resize += new EventHandler(datagrid_Resize);
panel4.Controls.Remove(datagrid);
panel4.Invalidate();
datagrid.Location = new System.Drawing.Point(0, 40);
panel4.Controls.Add(datagrid);
columnsWidth = datagrid.Columns.GetColumnsWidth(DataGridViewElementStates.Visible);
checkDatagridControls();
datagrid.ScrollBars = ScrollBars.Both;
datagrid.Anchor = (AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right);
datagrid.Dock = (DockStyle.Top);
AdjustDatagridHeight();
AdjustDatagridWidth();
datagrid.RowHeadersVisible = false;
datagrid.AutoResizeColumnHeadersHeight();
}
一旦获得新的数据网格,就会调用上面的代码:
datagrid = file.returnDatagrid(mouse, experiment);
ConfigureDatagrid();
面板从Winform传递到datagrid类。
答案 0 :(得分:2)
您的代码不完整。 “datagrid”究竟指的是什么以及它是如何启动/处置的?在你的活动?那你为什么不处理删除/添加呢?
panel4.Controls.Remove(datagrid);
panel4.Controls.Add(datagrid);
你在这里基本上做的只是删除元素然后再添加它。 你应该在活动开始前拨打第一行,我想你已经完成了。
此外,我认为你没有正确地做事:为什么要删除/添加你的DGV并用相同的组件替换它。不应该这样。因为看起来你正在处理相同类型的数据,所以你应该只在不触及DataGridView的情况下影响DataTable
编辑:
根据您的编辑和评论,这应该更有意义:
panel4.Controls.Remove(datagrid);
datagrid=file.returnDatagrid();
panel4.Controls.Add(datagrid);
panel4.Invalidate();
答案 1 :(得分:1)
您正在移除并阅读相同的datagrid
:
panel4.Controls.Remove(datagrid);
panel4.Invalidate();
datagrid.Location = new System.Drawing.Point(0, 40);
panel4.Controls.Add(datagrid);
此代码中没有任何地方更新datagrid
,因此您尝试删除Controls
中不存在的内容,然后添加它。
在更新变量之前,您需要将旧 datagrid
传递给Remove
或将其删除:
panel4.Controls.Remove(datagrid);
datagrid=file.returnDatagrid();
datagrid.Location = new System.Drawing.Point(0, 40);
panel4.Controls.Add(datagrid);
panel4.Invalidate();