如何使用绑定到数据表的 c#winforms 保存我的 datagridview

Posted

技术标签:

【中文标题】如何使用绑定到数据表的 c#winforms 保存我的 datagridview【英文标题】:How to save my datagridview with c# winforms bounded to a datatable 【发布时间】:2021-04-15 00:27:27 【问题描述】:

我已经使用设计器将我的 MSSQL 数据表绑定到 datagridview(数据表至少有 30 列),它会像这样填充数据:

this.produktaiTableAdapter.Fill(this.veiklosDuomenysDataSet.Produktai);
this.produktaiBindingSource.Filter = advancedDataGridView1.Columns[1].HeaderText + " = " + Veiklos_ID;

我有必要像这样绑定它,因为我有很多关于 DGV 中每一列的代码(例如,宽度、货币等)。

现在我想通过单击“保存”按钮将 datatagridview 中所有新的、更新的和删除的数据保存到我的 MSSQL 数据表中。我怎样才能做到这一点?如何将我编辑的 datagridview 转换为数据表?

我也在我的保存按钮单击时尝试了此代码:

this.Validate();
this.produktaiBindingSource.EndEdit();
this.produktaiTableAdapter.Update(this.veiklosDuomenysDataSet.Produktai);

而且.. 它不起作用。我对 datagridview 和 datatables 总体上是相当新的,因为我认为这个问题应该很容易解决。

编辑:

另外,这条线有什么帮助吗?

DataTable Produktai = advancedDataGridView1.DataSource as DataTable;

EDIT2: 这也不起作用。

veiklosDuomenysDataSet.Naudotojai.AcceptChanges();
this.Validate();
this.produktaiBindingSource.EndEdit();
this.produktaiTableAdapter.Update(this.veiklosDuomenysDataSet.Produktai);
MessageBox.Show("Data is saved!");

EDIT3:

这是我的主窗体的调试图:Here

如您所见,我没有文本框或按钮,如 INSERT、DELETE 和 UPDATE。用户只需单击单元格并编辑值即可编辑 DGV,只需按 ENTER 即可添加新行,通过单击同一选定行上的删除(图片中的 Ištrinti)删除该行(注意:删除按钮列是唯一的DGV 中的未绑定列)。

我使用 MSSQL 数据表将其与 datagridview 绑定,并且我希望 datagridview 中的所有新行、删除或编辑的行在数据表中更新/更新,它也由保存按钮绑定。

也许这个信息应该有一些不同的东西,一个疯狂的猜测?

【问题讨论】:

定义“它不起作用”。顺便说一句,您已将整个数据库表下载到客户端,然后在其上运行过滤器。这几乎肯定比更改(或添加)tableadapter 查询以减少下载数据更糟糕 不,您编辑的行对 tableadapter 保存修改行的能力没有帮助,或者根本没有做任何事情。您的保存代码很好。您不会将数据网格视图转换为数据表;当 DGV 绑定到表时,在 UI 中编辑您在 DGV 中看到的数据将编辑数据表的内容 sqlserver 是使用始终连接的数据库,还是您的程序每次运行时都连接数据库?如果您已退出表单,我不明白如何刷新数据集数据。你打开一个新表格吗? 在运行保存代码之前,您是否在任何地方调用了 AcceptChanges? 不要调用 AcceptChanges。我正在针对可能有问题的事情提出问题,我只是希望他们得到回答,我不希望您做出假设并开始编写代码..如果您经常将代码作为一个问题进行编辑,这将使事情变得更加困难正试图被诊断出来。再次删除AcceptChanges,绝对是错误的做法 【参考方案1】:

重新开始 - 这将产生比较的基础

我保存时没有遇到任何问题:

新建一个项目 打开服务器资源管理器,添加连接 选择 SQLServer 文件驱动,放置新文件的路径(new.mdf),点击确定,说是创建它 在服务器资源管理器中展开新节点,右键单击表格,添加一个列名合理的新表格(只有字母和数字,没有空格,没有标点符号或其他符号 - 你可以添加百分号等,它会仍然有效,但是没有人这样做是有原因的,那是因为它使生活变得非常艰苦。如果您认为想要一个名为“Profit %”的列,请将其称为“ProfitPercent”)。保存表格。 打开数据源工具面板,添加新数据源,选择数据库,选择数据集,选择new.mdf的连接字符串 请认真阅读它提出的下一个问题。不要只是跳过它。如果您说是,那么默认情况下,您的程序将动态附加一个数据库,该数据库在您每次运行程序时都会被删除和替换(但这通常是您想要的)。如果您说“否”,那么请理解您的程序编辑的数据库可能根本不在项目文件夹中 Tixk 向导中的表,或关闭向导并将新表从服务器资源管理器拖到数据集中。保存数据集 打开表单,将表格表示拖出数据源工具面板并拖到表单上。出现一个datagridview 运行程序,添加一些行,点击保存按钮 停止程序,再次运行 - 如果您之前对重要问题说“不”,这些行就会出现。如果您说是,则停止程序,单击解决方案资源管理器中的 new.mdf 文件,将“始终复制”更改为“如果较新则复制”,再次运行程序。添加行,保存,停止程序并再次运行它,行将在那里。它们消失的唯一情况是您更改 new.mdf 数据库的设计(使其更新)

您的表单代码现在将类似于:

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
    

    private void myTableBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    
        this.Validate();
        this.myTableBindingSource.EndEdit();
        this.tableAdapterManager.UpdateAll(this.newDataSet);

    

    private void Form1_Load(object sender, EventArgs e)
    
        // TODO: This line of code loads data into the 'newDataSet.MyTable' table. You can move, or remove it, as needed.
        this.myTableTableAdapter.Fill(this.newDataSet.MyTable);

    

而且你不会写任何东西。这就是使用 datagridview 加载、显示、编辑和保存数据所需的全部内容。对tableAdapterManager.UpdateAll 的调用相当于someTableAdapter.Update - tableadaptermanager 是一种便利设备,它以正确的顺序调用 Update 以确保在相关子行之前创建父行

【讨论】:

【参考方案2】:

就“这就是你的保存方式”而言,发布的代码没有任何问题,因此诊断需要有条不紊地追查:

运行程序,将数据加载到网格中,编辑部分数据 在更新前暂停调试器,并在即将保存的数据表上调用 GetChanges 如果没有更改,则说明该表未编辑(网格绑定到不同的表)或未进行编辑(网格编辑已取消未提交)或编辑已恢复或接受(RejectChanges 或 AcceptChanges在数据表上调用) 如果有变化,则转移到从 tableadapter 更新捕获返回值(写 var x = tableadapter.update(..)),然后调试器跳过对更新的调用 如果结果为 0,则没有更新任何行;如果发生更改并且为并发启用了 tableadapter 查询(可能是默认设置),这应该会导致并发异常。如果您的 tableadapter 没有内置更新查询,那么如果您尝试保存编辑,您应该再次收到异常(“当传递带有修改行的集合时,更新需要有效的 updateconmand”。如果它只是 0 并且没有抛出异常然后由于某种原因没有更新任何行 - 这不是我所期望的情况,需要更多调查 如果结果 > 0,则进行了更新(已保存更改)。在 tableadapter 上,Update 方法负责所有的插入、更新和删除。如果您看不到您的更改,则很可能是在查找错误的数据库文件,或者您的构建过程正在擦除您的文件并用新文件替换它。这最常发生在基于文件的数据库(如 Access)中,但如果您的数据库文件被动态附加和分离,则可能发生在 sql server 中

【讨论】:

你能检查一下 EDIT3,可能我一开始这个问题就不好。我现在将继续消化你的答案。 结果为 0,但我认为问题出在我的数据表列值上,它们不是数据属性名称应有的样子。例如:这是来自我的即时窗口,_Akcija___Column: Akcija, % _Antkainis___Column: Antkainis, % _Galutinė_kaina__EURColumn: Galutinė kaina, EUR 结果还是0,没有异常。 您是否将数据库列命名为Akcija, %Antkainis, %?我怀疑这会导致问题(您可以看到代码通过用下划线替换逗号、空格和百分号来处理它们),但是使用这样的列名是一种让人头疼的快速方法。重命名它们,以便它们只使用 NamesLikeThis - 没有空格、没有标点符号、没有百分号或其他在 SQL 中表示某些含义的字符 在您说“结果为 7”之前,我不确定您所说的“结果为 0”是什么意思

以上是关于如何使用绑定到数据表的 c#winforms 保存我的 datagridview的主要内容,如果未能解决你的问题,请参考以下文章

如何实现c# winform DataGridView添加一行,添加数据后,保存到数据库?

c#winform如何把数据保存到服务器上

c# winform DataGridView添加一行,添加数据后,保存到数据库

C#...WinForm如何保存最近一次登录的账号?

使用 c# winforms 将数据更新/保存到 SQL 数据库表

如何使用 C# 在 WinForm 中手动绑定到蓝牙低功耗设备?