我想编写一个更新数据库中数量的函数。在我的代码中,它将引发错误“ stokModel为null”。为什么?我无法在我的datagridview行中找到id,并且stok模型返回null。我的问题是如何在xstSabits中获取每个记录的ID,并使用此ID更新数量。
这是我的代码;
private void StokMiktariGuncelle()
{
for (int i = 0; i < dgvSepet.Rows.Count; i++)
{
using (fastCellDbEntities db = new fastCellDbEntities())
{
var stokModel = db.xstSabits.Find(Convert.ToInt32(dgvSepet.Rows[i].Cells["Id"].Value));
stokModel.azamiStok -= stokModel.azamiStok - Convert.ToDecimal(dgvSepet.Rows[i].Cells["Quantity"].Value);
db.Entry(stokModel).Property(x => x.azamiStok).CurrentValue = stokModel.azamiStok;
db.SaveChanges();
}
}
}
答案 0 :(得分:0)
似乎在DataGriView中管理您的ID似乎有些棘手。
当您要手动设置列时,您可能需要考虑设置每列的DataPropertyName
属性。完成此操作后,您可以将您的DatabaseModels直接绑定到Grids DataSource。
这将使从选定行中读取ID变得容易。
这是一个简单的示例:
CREATE TABLE exampleEntity
(
[Id] int not null PRIMARY KEY IDENTITY(1,1),
[SomeValue] int not null,
[SomeString] varchar(max) null
);
INSERT INTO exampleEntity ([SomeValue], [SomeString])
VALUES
(42, 'String21ß'),
(35, 'asdadkpq3eß0i'),
(37, ''),
(24, null),
(17, 'laksjdadjqpwdp')
;
从这个简单的数据库中,我从数据库EF模型中建立了代码优先的支架。
然后只需设置您的DataGridView(向每列添加DataPropertyName
)
public Form1()
{
InitializeComponent();
this.dt.AutoGenerateColumns = false;
this.dt.MultiSelect = false;
this.dt.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
//Id column
this.dt.Columns.Add(new DataGridViewTextBoxColumn()
{
DataPropertyName = "Id", //Name of database column
Name = "Id", //Display name of datagrid column
Visible = false
});
//SomeValue Column
this.dt.Columns.Add(new DataGridViewTextBoxColumn()
{
DataPropertyName = "SomeValue",
Name = "Value"
});
//SomeString Column
this.dt.Columns.Add(new DataGridViewTextBoxColumn()
{
DataPropertyName = "SomeString",
Name = "String"
});
}
然后要加载数据,您现在可以使用DataBinding:
private void Form1_Load(object sender, EventArgs e) => this.dt.DataSource = new ExampleModel().exampleEntities.ToList();
现在从所选项目中读取ID非常简单:
private void Button1_Click(object sender, EventArgs e)
{
//Read id from selected item
int idSelectedItem = (this.dt.SelectedRows[0].DataBoundItem as exampleEntity).Id;
using (ExampleModel ctxt = new ExampleModel())
{
exampleEntity entity = ctxt.exampleEntities.Find(idSelectedItem);
entity.SomeValue += 42;
ctxt.SaveChanges();
}
}
重要提示,如果您重用了用于填充DataGridView的相同上下文,则可以避免在读取所选项目时打开另一个上下文。