我正在开发一个项目,我必须在数据库中保存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
的新实例,然后清除行&列但结果相同
我是来自Database& amp的数据集。使用此代码将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
答案 0 :(得分:3)
您无法同时使用DataGridView和Rows以及Columns同时使用DataBinding (the DataSource)。你必须以任何一种方式工作。
来自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 设置为时,不会显示任何行没什么,这将继续显示列标题。
此外,如果您不希望将预先添加的对象与在DataGridView.DataSource = Nothing
之后添加的新对象一起保存,则必须将其从基础列表中删除绑定到您的DataGridView,因为它所做的只是取消显示信息,但是,例如,如果绑定到DataTable实例,您在DataSource = Nothing
之前添加的行仍在那里,因此,当你保存时,他们都会一起保存。
我建议您从基础DataSource
或您可能拥有的任何数据源中销毁添加的行,而不是将Nothing
设置为DataTable
。
答案 1 :(得分:1)
正如@Plutonix已经提到的,您的DataGridView绑定到数据源并清除行和列不会删除源。 这一行:
gd.DataSource = Nothing
应该只需要清除网格,因为这将取消绑定源。 显示您如何从网格中保存新条目的代码,因为您如何概述您的流程:
“但是当我添加另一行并再次保存时,之前添加的记录会再次保存,新添加的记录也会”,
介绍了有关如何设置代码的结果。