Datagridview行&列不清除

时间:2014-09-01 17:11:48

标签: vb.net winforms datagridview

我正在开发一个项目,我必须在数据库中保存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

2 个答案:

答案 0 :(得分:3)

您无法同时使用DataGridViewRows以及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

应该只需要清除网格,因为这将取消绑定源。 显示您如何从网格中保存新条目的代码,因为您如何概述您的流程:

但是当我添加另一行并再次保存时,之前添加的记录会再次保存,新添加的记录也会”,

介绍了有关如何设置代码的结果。