“Ghost”行,SQL Server 2008 + .NET Windows编程

时间:2012-01-24 20:32:07

标签: .net sql-server-2008 datagridview

我有一个数据库,在SQL Server 2008上运行了几个表,我正在编写一个带有.NET 3.5的Windows应用程序,使用提供的类来查询服务器。我遇到了一个问题,每个表中都包含一个看似持久的“空白”行。

例如,我将DataGridView绑定到BindingSource,其中DataSource是由连接到我的数据库的SqlDataAdapter构造的表,我在DataGrid上显示结果。该表中有1条记录:

dataGridView->DataSource = bindingSource;
bindingSource->DataSource = GetData(
    "Select * From xxxx", Get_DB_String(), dataAdapter );

其中GetData定义为:

DataTable^ GetData(
    String^ sqlCommand,
    String^ connectionString,
    SqlDataAdapter^ adapter )
   {
      SqlConnection^ Connection = gcnew SqlConnection( connectionString );
      SqlCommand^ command = gcnew SqlCommand( sqlCommand,Connection );
      adapter->SelectCommand = command;
      DataTable^ table = gcnew DataTable;
      adapter->Fill(table);
      return table;
   }

以下网格是它产生的:

grid

如果我检查table->Rows->Count,在适配器填满表后,它会产生1,bindingSource->Count也是如此。但是,在检查rows->Count时,DataGridView会报告2行。

现在,如果我加载SQL Server Management Studio并查看我的表,我会看到以下视图:

grid

但是,该行无法删除/删除,如果我编辑一行中单元格的任何内容,则只需添加一个新的整个NULL行。我认为这是出于某些目的而设计我不知道,但我也是这个问题。

如果我尝试从DataGridView中显式删除该行,它将返回:“无法删除未提交的新行”,并且在使用SqlDataAdapter填充后,我无法尝试从表中删除该行,因为它没有不要把它报告在那里。

这个问题不仅严重破坏了应用程序的美观,而且还破坏了功能,因为我无法在绑定的DataGridView上运行不存在的数据的例程。

我希望我能够简明扼要地传达我的问题。谢谢。

3 个答案:

答案 0 :(得分:4)

此行用于在数据集中插入新记录。如果你把它留空,那么它只是留空。如果您开始编辑它 - 它等待编辑完成(当您将焦点设置在此行之外)并添加具有指定字段值的新记录。

如果要在DataGridView中禁用此功能,只需将属性AllowUserToAddRows设置为false,如下所示:

dataGridView->AllowUserToAddRows = false;
dataGridView->DataSource = bindingSource;
...

答案 1 :(得分:2)

您的底行是用于手动插入新行的默认“新行”。我不认为你可以摆脱它(我知道你不能在SQL中,但如果你可以在你的GridView中,它将是控件的属性)。

答案 2 :(得分:1)

您也可以在表单设计器中设置它;单击控件,转到“属性”窗口并设置AllowUsersToAddRows = false。