【问题标题】:c# Problems with datagridc# 数据网格的问题
【发布时间】:2011-01-14 11:56:38
【问题描述】:

我有一个在单击树视图节点时触发的事件,然后创建一个数据网格视图并将其添加到面板中:

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();

然后添加新的数据网格:

 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 类。

【问题讨论】:

  • 请在您要删除现有数据网格的地方显示代码。

标签: c# winforms datagridview


【解决方案1】:

您的代码不完整。 “数据网格”到底指的是什么以及它是如何启动/处置的?在你的活动中?那你为什么不在那里处理删除/添加呢?

panel4.Controls.Remove(datagrid);
panel4.Controls.Add(datagrid);

您在这里所做的基本上只是删除元素然后再次添加它。 你应该在你的活动之前调用第一行,我想你已经完成了。

此外,我认为您做事不正确:为什么要删除/添加您的 DGV 并用相同的组件替换它。不应该这样。因为看起来您正在处理相同类型的数据,所以您应该只影响 DataTable 而无需触摸 DataGridView

编辑:

根据您的编辑和 cmets,这应该更有意义:

panel4.Controls.Remove(datagrid);
datagrid=file.returnDatagrid();
panel4.Controls.Add(datagrid);
panel4.Invalidate();

【讨论】:

  • 谢谢,我现在可以使用了。我使用新数据网格这样做的原因是,根据用户单击的节点,数据网格可能会完全不同。 datagridviews 是从许多插件 dll 中获得的,这些插件 dll 从数据集中填充数据网格,但随后还会在某些地方添加检查列等内容,它们在 dll 之间差异很大,所以我不能只在客户端上拥有 datagrid 对象使用不同数据集更新的机器。除非你知道不同的方式——我会很高兴听到它。感谢您的帮助。
  • 我也遇到过类似的问题,我的建议是你真的应该避免使用异构 dll。填充数据网格应该是通用的和直截了当的。但是首先,根据经验,请非常小心地将数据逻辑与表示逻辑分开。在您的情况下,这两者似乎非常紧密,这是有问题的:分别处理每个问题(Data/Prez),这将更加清洁和可维护。如果您想在不同节点上为您的 DGV 添加特定行为,则可以使用相同的组件,在需要时进行调整以适应您的演示需求。
  • 嗨,Mika,对于延迟回复深表歉意 - 我刚刚注意到您的回复。在这种情况下,关于数据/pres 的分离,您是什么意思。在我的例子中,单击树视图节点,以 xml 格式从数据库中获取数据,然后填充数据表,然后填充到数据网格中。这是不正确的吗?谢谢。
  • 我的意思是,无论您的数据的来源和性质是什么,它都不应该影响您的数据网格。您的表示逻辑应该独立于数据检索的过程。您会看到,每当您检索数据时,您都会不断地调用您的 ConfigureDatagrid 方法,并影响您的面板,删除/添加 dg。在我的意义上,这是一个非常糟糕的设计,你应该找到一种方法以一种更干净、更流畅的方式,分别独立地做到这一点。
  • 最重要的是,尽量避免改变您的面板/dg。相反,只需更改绑定和数据表。
【解决方案2】:

您正在删除和阅读相同的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();

【讨论】:

  • datagrid 用 datagrid=file.returnDatagrid() 改变如上。我是否应该在获得新数据网格之前删除旧数据网格,这是您的意思吗?
  • @Darren - 是的。这确实是我要说的。
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2012-02-28
相关资源
最近更新 更多