【发布时间】:2024-01-08 23:37:06
【问题描述】:
使用; c#, .net 4.5 vs 2012 winforms
尝试使用 EntityFramework 将一些新数据保存到已经绑定到 dataGridview 的数据库中。
要在 dataGridView 中显示来自 db 的数据,请使用以下代码:
所有方法都使用
LibraryLib.LibraryEntities context = new LibraryLib.LibraryEntities();
在一种方法中,我称之为:
BindingSource bs = new BindingSource();
bs.DataSource = typeof(LibraryLib.Book);
context.Book.ToList().ForEach(n => bs.Add(n));
dataGridViewDB.DataSource = bs;
BindingSource bstab2 = new BindingSource();
bstab2.DataSource = typeof(LibraryLib.LibraryStock);
context.LibraryStock.ToList().ForEach(n => bstab2.Add(n));
dataGridViewCategoryDB.DataSource = bstab2;
在另一种方法中,使用下一个代码保存数据(更改后按按钮调用):
context.SaveChanges();
context.Dispose();
我的数据库图表
结果 -
我可以在 dataGridview 中看到我所有的数据库条目。
我可以更改任何单元格,如果保存 - 全部保存。但是,如果我添加新项目或删除现有项目(在两个表中 - 意味着从两个表中删除依赖条目),此更改不会保存? 输入数据时,所有必需的数据格式(平均 varchar 或 int) - 好的。
正如我所读 - 我可以将数据绑定到 datagridView 然后修改它,添加或删除任何条目,然后使用 ObjectSetsaveChanges() 中的方法保存它?我说的对吗?
问题为什么我在保存更新(添加或删除)数据时遇到问题,我错在哪里?
编辑
非常感谢potehin143
的帮助我用另一种方法解决了这个问题 - 创建一些方法来添加和删除 DatdBase 中的条目
由于我的程序设计视图,我尝试对所有类型的引擎使用通用逻辑(意味着诸如添加、删除、更新库中的条目等功能)
接下来要添加代码:
public void AddNewBookEF()
{
string id = Guid.NewGuid().ToString();
LibraryLib.LibraryStock newCat = new LibraryLib.LibraryStock();
newCat.ID = id;
newCat.Category = listBoxShelfDB.Text;
context.LibraryStock.Add(newCat);
LibraryLib.Book newBook = new LibraryLib.Book();
newBook.ID = id;
newBook.Author = textBoxAuthorDB.Text;
newBook.Name = textBoxNameDB.Text;
newBook.Year = Int32.Parse(numericUpDownYearDB.Value.ToString());
newBook.Genre = textBoxGenreDB.Text;
context.Book.Add(newBook);
context.SaveChanges();
}
对于从数据库中删除条目,请准备如下代码:
public void RemoveFromDBEF(string bookId)
{
if (dataGridViewDB.SelectedRows.Count == 1)
{
LibraryLib.Book bookToDelete = new LibraryLib.Book();
bookToDelete.ID = bookId;
foreach (LibraryLib.Book entry in context.Book)
{
if (entry.ID == bookId)
context.Book.Remove(entry);
}
foreach (LibraryLib.LibraryStock entry in context.LibraryStock)
{
if (entry.ID == bookId)
context.LibraryStock.Remove(entry);
}
context.SaveChanges();
}
else
{
MessageBox.Show("Please select only one row for deleting in Book table");
}
}
bookId - Guid 标识符,转换为字符串并保存到 DB(当我开始准备程序时,我不知道 DB 中现有的 Guid 类型,所以不要为这个程序重写所有代码,我只是现在学习)。要在 DataGridView 中查找所选书籍的 bookId,请使用如下代码:
private string GetGuidAsString()
{
try
{
...
if (this.tabControlEngines.SelectedIndex == 2)
{
//get selected number of cell
int index = dataGridViewDB.SelectedCells[0].RowIndex;
//get selected row
DataGridViewRow selectedBook = dataGridViewDB.Rows[index];
string guidOfBook = Convert.ToString(selectedBook.Cells[0].Value);
return guidOfBook;
}
}
catch (ArgumentOutOfRangeException)
{
MessageBox.Show("Please select a book or add books to empty lib", "No book selected");
return null;
}
catch (Exception) { }
return null;
}
也许这个答案对某些人会有所帮助。
【问题讨论】:
标签: c# .net winforms entity-framework datagridview