首页 > 解决方案 > 如何在 Visual Studio 的数据集中添加/删除/修改特定数据表中的行?

问题描述

在 Visual Studio 项目中Dataset,我有一个名为Tablas_calendario. 我希望如果我单击一个按钮,我可以在Tablas_calendario.

假设我有一个DataTable呼叫DataTable1,我想添加一行如果我执行以下任何操作:

DataRow newRow = Tablas_calendario.DataTable1DataTable.NewRow();
DataRow newRow = Tablas_calendario.DataTable1.NewRow();
DataRow newRow = Tablas_calendario.Tables["DataTable1"];

我收到错误,都说您需要 Tablas_calendario.Tables、Tablas_calendario.DataTable 等的非静态参考...

我一直在网上寻找解决方案,但它们都是上述方法的变体。

谁能指出我正确的方向?

标签: c#exceptiondatatabledatasetstrongly-typed-dataset

解决方案


假设:

  • 您有一个强类型数据集,即您调用的类型Tablas_calendario
  • 您的数据集包含一个强类型数据表,设计器将其名称命名为 DataTable1。
  • 您已经创建了这样的数据集实例Tablas_calendario tcDataset = new Tablas_calendario();
  • DataTable1 有两列:Name (string)Age (int)

您可以像这样在 DataTable1 表中创建新行:

//add a new row by providing all its values
tcDataset.DataTable1.AddDataTable1Row("Federico", 33);

//create a new row then add it - useful if you don't know all the values first
var newRow =  tcDataset.DataTable1.NewDataTable1Row();
newRow.Name = "Federico";
newRow.Age = 33;
tcDataset.DataTable1.Add(newRow);

不要使用NewRow- 它返回一个基本类型 DataRow,首先剥夺了拥有强类型内容的所有优势(命名属性,如Name/stringAge/int类型)


您的基本问题之一是设计器中数据集类型的名称:

在此处输入图像描述

您可能已经将类型命名为您应该命名的实例变量。考虑将其命名为包含单词“DataSet”的名称,以保持数据集设计器为其他所有内容制定的命名约定:设计图面上名为“DataTable1”的表实际上是“DataTable1DataTable”类型,并且具有“DataTable1Row”行。也称它为比“DataTable1”更好的东西。例如,调用您的数据集“CalendariosDataSet”和其中的表,如果它与一个人相关,则称它为 Person(我上面的示例):

在此处输入图像描述

您的代码如下所示:

CalendariosDataSet ds = new CalendariosDataSet(); ds.Person //它是数据集对象的一个​​属性,它返回数据集持有的PersonDataTable实例

ds.Person.Count; //it's the count of rows

ds.Person[0].Name = "Federico";  //it edits the name of the first person 

foreach(var pRo in ds.Person) //it enumerates the rows as PersonRow objects

避免使用 Rows 集合,因为它又是通用的基本类型 DataRow:

ds.Person.Rows[0]. // it has no Name property, it is just a DataRow, not a PersonRow
ds.Person.Rows[0]["Name"] = "Federico"; //it would access the name, as an object, but again you lose all the benefits of strong typing! 

要非常清楚,您了解类和实例之间的区别:

public class Person{

  public string Name {get; set; }

}

static void Main(string[] arg){

  Person.Name = "Federico"; //"need an instance for the non static class Person" error

} 

这完全是您现在遇到的问题;你认为你有一个数据集的实例,但你没有——你指的是类型,就好像它是一个实例一样。


推荐阅读