Datagridview 行和列未清除
Posted
技术标签:
【中文标题】Datagridview 行和列未清除【英文标题】:Datagridview rows & columns not clearing 【发布时间】:2014-09-01 17:11:47 【问题描述】:我正在做一个项目,我必须将 Datagridview 添加的行保存在数据库中,保存记录后我想清除 Datagridview,这是我用来实现它的代码
Public Sub ClearGrid(ByRef gd As DataGridView)
gd.Columns.Clear()
gd.Rows.Clear()
gd.DataSource = Nothing
End Sub
这段代码清除了Datagridview中的行和列,但是当我添加另一行并再次保存时,之前添加的记录会再次保存,新添加的记录也会被保存
我也尝试创建 Datagridview myGrid = new Datagridview
的新实例,然后清除行和列,但结果相同
我正在从数据库中填充 DataTable 并使用此代码将 rom 添加到 Datagridview
With MyDataTable.Rows(0)
Dim row As String() = New String() _
.ItemArray(0).ToString(), .ItemArray(1).ToString(), _
.ItemArray(1).ToString(), .ItemArray(3).ToString(), _
.ItemArray(4).ToString(), .ItemArray(5).ToString(), _
.ItemArray(6).ToString(), .ItemArray(7).ToString(), _
.ItemArray(8).ToString(), .ItemArray(9).ToString(), _
.ItemArray(10).ToString(), .ItemArray(11).ToString(), _
.ItemArray(12).ToString()
myGrid.Rows.Add(row)
End With
【问题讨论】:
如果您的 DGV 使用数据源,请清除其中的数据,而不是 DGV 行。尝试这样做通常会导致崩溃。 @Pluonix : 请检查已编辑的问题 你正在疯狂地混合和匹配类型。无论您给它起什么名称,字符串数组都不是 DataGridViewRow。MyDataTable
在其中扮演什么角色?如果它是 DGV 的数据源,您应该从中添加(和删除)它,而不是 DGV。如果它使用数据源,则 DGV 只是用户查看数据的查看器。立即开启 Option Strict。
【参考方案1】:
您不能同时使用Rows 和Columns 和DataBinding (the DataSource) 两种方式使用DataGridView。无论哪种方式,你都必须工作。
来自 MSDN:
Data Display Modes in the Windows Forms DataGridView Control
未绑定
未绑定模式适用于显示您以编程方式管理的相对少量的数据。您不会像在绑定模式中那样将 DataGridView 控件直接附加到数据源。相反,您必须自己填充控件,通常使用 DataGridViewRowCollection.Add 方法。
未绑定模式对于静态、只读数据或当您想要提供与外部数据存储交互的自己的代码时特别有用。但是,当您希望您的用户与外部数据源进行交互时,您通常会使用绑定模式。
有关使用只读未绑定 DataGridView 的示例,请参阅如何:创建未绑定 Windows 窗体 DataGridView 控件。
绑定
绑定模式适用于使用与数据存储的自动交互来管理数据。您可以通过设置 DataSource 属性将 DataGridView 控件直接附加到其数据源。当控件是数据绑定时,无需您进行显式管理即可推送和拉取数据行。当 AutoGenerateColumns 属性为 true 时,数据源中的每一列都会导致在控件中创建相应的列。如果您更喜欢创建自己的列,可以将此属性设置为 false,并在配置时使用 DataPropertyName 属性绑定每个列。当您要使用默认生成的类型以外的列类型时,这很有用。有关详细信息,请参阅 Windows 窗体 DataGridView 控件中的列类型。 有关使用绑定 DataGridView 控件的示例,请参阅演练:验证 Windows 窗体 DataGridView 控件中的数据。
您还可以在绑定模式下将未绑定的列添加到 DataGridView 控件。当您想要显示一列按钮或链接以使用户能够对特定行执行操作时,这很有用。显示具有从绑定列计算的值的列也很有用。您可以在 CellFormatting 事件的处理程序中填充计算列的单元格值。但是,如果您使用 DataSet 或 DataTable 作为数据源,则可能希望使用 DataColumn.Expression 属性来创建计算列。在这种情况下,DataGridView 控件将像对待数据源中的任何其他列一样对待计算列。
不支持在绑定模式下按未绑定列排序。如果在绑定模式下创建包含用户可编辑值的未绑定列,则必须实现虚拟模式以在控件按绑定列排序时维护这些值。
回答您的问题
如果将 DataGridView.DataSource 属性设置为 Nothing 不一定会清除行标题,因为data binding 使 DataGridView 知道如果您在设计器中设置其绑定,则为数据源。因此,即使您将其设置为空,它也知道需要显示的列。
如果您确实想彻底清除 DataGridView,则需要从设计器中移除其数据绑定,并让 DataGridView 通过数据绑定动态构建其列集合。
但是,您必须订阅和处理 BindingContextChanged 或 BindingSource.ListChanged 事件才能删除不需要的列来显示。最好始终使用BindingSource,以便始终设置显示列,并且在没有数据时根本不显示行,或者您的 BindingSource.DataSource 设置为 Nothing,这将继续显示列标题。
此外,如果您不希望将预先添加的对象与 DataGridView.DataSource = Nothing
之后添加的新对象一起保存,则必须将它们从绑定到 DataGridView 的基础列表中删除, 因为这只是为了取消显示信息,但是,例如,如果您绑定到 DataTable 实例,您在 DataSource = Nothing
之前添加的行仍然存在,所以当您保存时,它们是一起保存。
我建议不要将DataSource
设置为Nothing
,而是从基础DataTable
或您可能拥有的任何数据源中销毁添加的行。
【讨论】:
【参考方案2】:正如@Plutonix 已经提到的,您的 DataGridView 已绑定到数据源,并且清除行和列不会删除源。 这一行:
gd.DataSource = Nothing
应该是清除网格所需的全部内容,因为这将取消绑定源。 显示您如何从网格中保存新条目的代码,因为您如何概述您的流程:
"但是当我添加另一行并再次保存时,之前添加的记录会再次保存,新添加的记录也会保存",
描述您看到的关于如何设置代码的结果。
【讨论】:
以上是关于Datagridview 行和列未清除的主要内容,如果未能解决你的问题,请参考以下文章
不能向没有列的 DataGridView 控件添加行.必须首先添加列.