为什么更新gridview也会更新数据源(datatable)?如果是 2 种方式,那么哪种方式更适合迭代?

Why does updating gridview also update the datasource (datatable)? If its 2 way then which is better for iteration?

我在代码中有一个数据table。以及 Ui.

中的 datagridview

在我已经完成的代码中 gridviewName.DataSource = dtTable1

现在,在 UI 中,我可以看到填充了 table 数据的 gridview。在 UI 网格视图中,我可以更新单元格值 and/or 删除数据行。对 gridview 进行任何更改后,更改会自动流回数据 table.

此时我有点困惑,因为我认为这是从数据 table 到 datagridview 的单向连接。这是设计的两种方式吗?如果是,那么随后如果我想每行执行一个操作,比如每行发送一封电子邮件,那么建议迭代 gridview 或数据 table?

是的,双向数据流是设计使然;它使创建应用程序变得容易得多。如果您不希望您的用户编辑网格,您可以将网格设置为只读,但通常您向用户显示数据,让他们编辑并保存。如果您将数据绑定作为网格直接连接到数据表的一种方式,那将需要更多的努力;它不会将找到的数据复制到自己的内部数据数组中

始终循环遍历数据表,读取并直接编辑;网格将相应更新;始终避免循环遍历 datagridview。作为模型-视图-控制器的体现,您的代码应该操纵模型(数据表),而不是尝试通过 view/controller 为用户(数据网格视图)

操纵模型

如果您将 DataSet 类型的文件添加到您的项目并在其中设计一个强类型的数据表,您的生活会变得更轻松。您的代码如下所示:

foreach(var r in soneDataset.EmailQueueDataTable){

  mailer.Send(r.From, r.To, r.Subject, r.Message, r.RetryAttempts);

}

使用标准数据表,一切都使用字符串列名或更糟糕的顺序位置完成,并且需要转换:

foreach(DataRow r in EmailQueueDataTable.Rows){

  mailer.Send((string)r["From"], (string)r["To"], (string)r["Sujbect"], (string)r["Message"], (int)r["RetryAttempts"]);

}

Intellisense 也不会帮助您处理列名;你只会在运行时发现我在 Subject

中打错了字