【发布时间】:2015-09-08 05:17:57
【问题描述】:
我是 Visual C# 的新手。我正在尝试使用数据库创建一个程序来注册产品和客户。我只是跟着这两个演练:
Creating a Local Database File in Visual Studio
Connecting to Data in a Local Database File (Windows Forms)
然后我在我的解决方案上创建了 3 个表单:
Form1:在几秒钟后隐藏并打开 Form2 的初始屏幕。
Form2:有 4 个面板,[A] 为产品添加新寄存器和编辑寄存器(我在“详细信息”模式下拖放表格),[B] 使用 DataGridView,其中单元格配置为只读 = true。其他 2 个面板与客户相同。
Form3:双击 DataGridView 中的单元格时打开的对话框。此对话框显示的产品数据只有几个可编辑的字段。
我的问题:
如果我在 Form2 [A] 上编辑一个字段并保存它,我可以在 DataGridView [B] 和 Form3 上看到更改。
如果我在 Form3 上编辑一个字段并保存它,然后关闭对话框,Form2 上没有任何更改,无论是面板 [A] 还是面板 [B]。但是当我再次打开 Form3 时,编辑的数据就在那里。如果我在 [A] 上编辑我在 Form3 上编辑的相同字段并尝试保存,则会出现以下错误:
LojaEstiloDesign20150906.exe 中出现“System.Data.DBConcurrencyException”类型的未处理异常
附加信息:并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条。”
这似乎是一个非常基本的问题,但我不知道如何解决它。我已经尝试了很多东西,但都没有奏效。 任何帮助将不胜感激。
表格2:
namespace LojaEstiloDesign20150906
{
public partial class frm_Menu : Form
{
public frm_Menu()
{
InitializeComponent();
}
private void CadProdutosToolStripMenuItem_Click(object sender, EventArgs e)
{
panel_CadastroProdutos.Visible = true;
panel_CadastroProdutos.Dock = DockStyle.Fill;
panel_CadastroClientes.Visible = false;
panel_ConsultaClientes.Visible = false;
panel_ConsultaProdutos.Visible = false;
}
private void CadClientesToolStripMenuItem_Click(object sender, EventArgs e)
{
panel_CadastroClientes.Visible = true;
panel_CadastroClientes.Dock = DockStyle.Fill;
panel_CadastroProdutos.Visible = false;
panel_ConsultaClientes.Visible = false;
panel_ConsultaProdutos.Visible = false;
}
private void ConProdutosToolStripMenuItem1_Click(object sender, EventArgs e)
{
panel_ConsultaProdutos.Visible = true;
panel_ConsultaProdutos.Dock = DockStyle.Fill;
panel_CadastroClientes.Visible = false;
panel_ConsultaClientes.Visible = false;
panel_CadastroProdutos.Visible = false;
}
private void ConClientesToolStripMenuItem1_Click(object sender, EventArgs e)
{
panel_ConsultaClientes.Visible = true;
panel_ConsultaClientes.Dock = DockStyle.Fill;
panel_CadastroClientes.Visible = false;
panel_ConsultaProdutos.Visible = false;
panel_CadastroProdutos.Visible = false;
}
private void frm_Menu_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
private void produtosBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.produtosBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.lojaEstiloDataSet);
}
private void frm_Menu_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'lojaEstiloDataSet.Clientes' table. You can move, or remove it, as needed.
this.clientesTableAdapter.Fill(this.lojaEstiloDataSet.Clientes);
// TODO: This line of code loads data into the 'lojaEstiloDataSet.Produtos' table. You can move, or remove it, as needed.
this.produtosTableAdapter.Fill(this.lojaEstiloDataSet.Produtos);
}
private void produtosDataGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
frm_FichaProdutos frm3 = new frm_FichaProdutos();
frm3.Show();
}
private void toolStripButton6_Click(object sender, EventArgs e)
{
this.Validate();
this.clientesBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.lojaEstiloDataSet);
}
}
}
Form3:
namespace LojaEstiloDesign20150906
{
public partial class frm_FichaProdutos : Form
{
public frm_FichaProdutos()
{
InitializeComponent();
}
private void frm_FichaProdutos_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'lojaEstiloDataSet.Produtos' table. You can move, or remove it, as needed.
this.produtosTableAdapter.Fill(this.lojaEstiloDataSet.Produtos);
// TODO: This line of code loads data into the 'lojaEstiloDataSet.Produtos' table. You can move, or remove it, as needed.
this.produtosTableAdapter.Fill(this.lojaEstiloDataSet.Produtos);
}
public void produtosBindingNavigatorSaveItem_Click_1(object sender, EventArgs e)
{
this.Validate();
this.produtosBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.lojaEstiloDataSet);
}
}
}
【问题讨论】:
-
在你的表单中 this.produtosTableAdapter.Fill(this.lojaEstiloDataSet.Produtos);行重复两次。而在 form2 中,您有 private void frm_Menu_Load(object sender, EventArgs e) { // TODO:这行代码将数据加载到“lojaEstiloDataSet.Clientes”表中。您可以根据需要移动或移除它。 this.clientesTableAdapter.Fill(this.lojaEstiloDataSet.Clientes); // TODO: 这行代码将数据加载到“lojaEstiloDataSet.Produtos”表中。您可以根据需要移动或移除它。 this.produtosTableAdapter.Fill(this.lojaEstiloDataSet.Produtos);}
-
@amitdayama 你应该把这个放到你的帖子里。请避免在 cmets 中给出答案。
标签: c# mysql database winforms visual-studio-2015