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

     2023-04-11     126

关键词:

【中文标题】如何使用绑定到数据表的 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 将数据更新/保存到 SQL 数据库表

】使用c#winforms将数据更新/保存到SQL数据库表【英文标题】:Updating/savingdatatoanSQLdatabasetableusingc#winforms【发布时间】:2021-09-0622:43:11【问题描述】:首先我会说我非常不擅长编码(尚未学习如何利用类以及它们如何深入工作),... 查看详情

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

】如何使用C#在WinForm中手动绑定到蓝牙低功耗设备?【英文标题】:HowtoBindmanuallytoaBlueToothLowEnergyDeviceinaWinFormusingC#?【发布时间】:2017-01-0123:54:47【问题描述】:这个问题的回答者大多是:WindowsUWPconnecttoBLEdeviceafterdiscovery目前,... 查看详情

如何在更新数据源时让绑定的 winforms 控件刷新?

】如何在更新数据源时让绑定的winforms控件刷新?【英文标题】:HowdoIgetboundwinformscontrolstorefreshwhentheirdatasourceisupdated?【发布时间】:2012-04-0819:27:57【问题描述】:我对使用C#(但不是C#本身)和数据绑定的整个概念处理数据库非... 查看详情

winform绑定到嵌套对象上的属性(代码片段)

...象上的属性关键字:WindowsForms,DataBindings,NestedClass,嵌套类在WinForm中很早就已经支持数据绑定,使用数据绑定可以大大减少更新界面和数据的代码.一般情况下,使用自定义的简单对象时数据绑定可以很好的工作,当我们的对象越来越复... 查看详情

c#winform项目中,如何使用字典代码?

...,愿意送出所有分数。不好意思,没说清楚,在下做的是WINFORM项目。不是WEB版的,没人给答案吗?有一个更好的办法,可以脱离数据库。但是仅能提供部分思路。那种没有什么变化的字典存在数据库内属于多余。可以直接写成... 查看详情

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

WinForm程序如何保存最近登录的账号?就像QQ一样...打开时会自动显示上次登录的账号..请提供一个思路和,最好有代码,谢谢了^_^WinForm保存最近一次登录的账号,常用的使用方式在客户端保存。将数据保存到文件中。比如说客户端的... 查看详情

winform开发中如何将数据库字段绑定到combobox控件

...多问题,希望通过博客把一些印象深刻的问题记录下来。Winform开发中如何将数据库字段绑定到ComboBox控件1.问题引入在开发中用到了ComboBox控件,也就是实现下拉选择功能的控件。但是选项的数据并不是固定的,而是要根据数据... 查看详情

c# winforms如何保存用户输入的数据

】c#winforms如何保存用户输入的数据【英文标题】:Howtosaveuserinputeddatac#winforms【发布时间】:2011-06-2701:48:51【问题描述】:我想知道如何保存用户输入的数据。就像他们在文本框中键入或选中复选框并在下次再次启动应用程序时... 查看详情

winform中如何判断控件的内容已经修改?

winform中,比如一个添加界面,或者修改界面,里面有一些TextBox还有一些ComboBox等一系列控件。要实现的效果就是:当这些控件中的数据修改后,比如填写了一些数据,还没有保存时用户要关闭此窗体,就提示用户是否保存。如... 查看详情

c#winform中上传图片保存到数据库中?

...面上点击上传图片,成功后把图片保存到数据库中就ok,C#winform中的,,最好有用到二进制方式存储,,求源码,,不胜感激。。。就是2中方法:1:上传图片的相对路径到数据库中相应字段里,读取显示时,将控件(假设用的是I... 查看详情

我在尝试将 winforms 文本框值保存到连接的 MS 访问数据库时出错

】我在尝试将winforms文本框值保存到连接的MS访问数据库时出错【英文标题】:IhaveerrorwhileI\'mtryingtosavewinformstextboxesvaluesintoaconnectedMSaccessdatabase【发布时间】:2021-10-1119:42:14【问题描述】:我已经创建了winform项目并将MSAccess数据... 查看详情

vs2008的c#winform开发,关于listview的数据绑定

listview怎么绑定数据库查询出来的东西,就例如我在数据库查询一个dataset,我怎么把dataset的数据绑定到listview,包括列名和每行数据参考技术AListView1.DataSource=DataSet.tables[0];ListView1.DataBind();参考资料:http://msdn.microsoft.com/zh-cn/librar... 查看详情

c#winform中界面加载时datagridview绑定了数据源(datatable),修改datagridview的内容后,如何更新数

重新绑定,例如:在事件中加入如下代码,datagridview.DataSours=(数据库新查询的数据);datagridview.Bind();参考技术A获取datagridview里边修改的数据直接sql语句直接修改, 参考技术B窗口的load事件里写绑定 查看详情

c#winform如何讲主界面的多个chart控件图保存为一幅?

C#winform如何将主界面的多个Chart图保存为一幅?像这样保存在一张图片里面,什么jpg,bmp,png格式都可以参考技术A自己绘制的图吗?还是用的第三方控件?自己绘制的图的话,好弄第三方控件的话,只能使用第三方控件的相关方法... 查看详情

数据库mysql如何保存表情符号然后返回到前端

...器,服务器如何保存,然后返回到前端参考技术A你是做winform吧,如果是web的话建议保存图像的二进制。winform可以用控件fileupload...图片的路径可以直接提取的(Server.MapPath),你可以查一下追问php 参考技术B用字符串,然后发过... 查看详情

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

参考技术A1、点击添加,实例化一个DataGridView的行对象DataRow然后把这个对象添加到DataGridView中,你的DataGridView要是可编辑状态,然后编辑数据,点保存循环读取DataGridView的行数据,存到实体类中,在通过后台SQL保存到数据库。2... 查看详情

Winforms:如何使用 C# 将图片上传到 SQL Server 数据库

】Winforms:如何使用C#将图片上传到SQLServer数据库【英文标题】:Winforms:HowtouploadapictureintoSQLServerdatabaseusingC#【发布时间】:2011-01-2320:05:59【问题描述】:我想将图像上传到我的SQLServer数据库。我有两个按钮,一个图片框。使用浏... 查看详情

如何使用 c# winform 将 10,000 行数据从存储过程移动到 excel

】如何使用c#winform将10,000行数据从存储过程移动到excel【英文标题】:Howtomove10,000rowsofdatafromaStoredProceduretoexcelusingc#winform【发布时间】:2012-07-1706:47:06【问题描述】:情况如下——UserX想要有关PlayerY的信息。目前,我获取有关Play... 查看详情