【发布时间】:2016-09-19 02:29:07
【问题描述】:
我正在使用 Visual Studio 2015 Enterprise,32 位版本。
首先,在我的项目中,我创建了一个基于服务器的数据库,并将其命名为 HR.mdf,所以我想使用 LocalDB,顺便说一句,我将其 Copy 设置为将字典 属性输出到如果较新则复制。在这个数据库中,我只有一个简单的表定义为:
CREATE TABLE [dbo].[contractor] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] VARCHAR (50) NOT NULL,
[IsMarried] BIT NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
其次我创建了一个名为 HR 的 DataSet 项,我将承包商表拖到设计面板中:
VS 2015自动生成了三个C#类:HR(它是一个强类型的DataSet,并且有三个内部类,包括一个强类型的DataTablecontractorDataTable,ant so on.)、contractorTableAdapter 和 TableAdapterManager。
所以现在我的解决方案如下:
然后,我将 Data Sources 选项卡中的承包商 Datagrid 拖到我的 WPF 主窗口中:
运行程序时,主窗口如下所示:
而我在 MainWindow 后面的 C# 代码是:
using System;
using System.Windows;
namespace DataSetLab
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private DataSetLab.HR hR;
private DataSetLab.HRTableAdapters.contractorTableAdapter hRcontractorTableAdapter;
private System.Windows.Data.CollectionViewSource contractorViewSource;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
hR = ((DataSetLab.HR)(this.FindResource("hR")));
// Load data into the table contractor. You can modify this code as needed.
hRcontractorTableAdapter = new DataSetLab.HRTableAdapters.contractorTableAdapter();
hRcontractorTableAdapter.Fill(hR.contractor);
contractorViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("contractorViewSource")));
contractorViewSource.View.MoveCurrentToFirst();
}
private void click(object sender, RoutedEventArgs e)
{
try
{
hRcontractorTableAdapter.Update(hR.contractor);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
hRcontractorTableAdapter.Fill(hR.contractor);
}
}
}
}
我期望的是,当我单击提交按钮时,我在该网格中所做的所有更改都会更新到数据库中,例如编辑记录和插入新记录。但事实上,我点击后什么都没有发生。
我从 MSDN 中找到了本教程:https://msdn.microsoft.com/en-us/library/ms171933(v=vs.140).aspx,但我没有在 MainWindow 类中的任何对象上找到 Validate() 或 EndEdit()。
我在 HR.design.cs 中的 Update() 方法中添加了一个断点,由 VS 2015 生成:
public partial class contractorTableAdapter : global::System.ComponentModel.Component {
//...
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
[global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
public virtual int Update(HR.contractorDataTable dataTable) {
return this.Adapter.Update(dataTable);
}
//...
}
但这一点从未达到过。
任何帮助表示赞赏,在此先感谢。 google了很多,没发现有人这样做。
【问题讨论】:
-
这个断点不会被命中,因为这个方法是用
DebuggerNonUserCodeAttribute标记的。而是在单击事件中的Update()调用上放置一个断点。我怀疑每次运行项目时都会覆盖您的 mdf。 -
我知道你的意思知道,如果我只是在/bin/debug中运行生成的.exe,它会将数据保存到该路径下的.mdf的副本中,并且似乎被覆盖了通过项目根目录下的副本。
-
根据 MSDN,将“复制到输出字典”更改为“始终复制”以外的其他选项应该可以解决此问题。
-
如果你都知道,那你在问什么?
标签: c# datagrid dataset tableadapter