我今天刚刚报名参加。我多年来一直在编写和维护我公司的Delphi ERP计划。去年我老板要我用C#重写整个ERP。花了我很多个月的时间来学习和构建我的基本C#代码。一切顺利。 Delphi技能有助于C#编码。无论如何,它仍然是Windows程序。但是当涉及到主人 - 细节结构时,我陷入了沼泽地。
使用Delphi编写主 - 细节程序是一块蛋糕。我唯一需要的是过滤器。与C#不同,Delphi DataGrid始终具有与相应表相同的行数。因为我使用过滤器在Delphi中实现了master-detail,所以我用C#做了同样的事情(我没有使用过ralation),结果很乱。
我实施主细节的方式有什么问题?我必须使用关系吗?我愿意使用关系,因为有时我想访问表中的所有行。或者,任何人都可以给我一个关于大师细节的好例子吗?
为了节省您的时间,我只是概述了一些事情。
master:DataGridView1< - BindingSource1< - Table1
详细信息:DataGridView2< - BindingSource2< - Table2
KeyColumn:RelateNo
在dataGridView1_SelectionChanged()中过滤:
bindingSource2.Filter = string.Format("RelateNo = '{0}'", ds.Tables["Table1"].Rows[bindingSource1.Position]["RelateNo"].ToString());
过滤器需要的默认值:
ds.Tables["Table1"].RowChanging -= new DataRowChangeEventHandler(DetailRow_Changing);
ds.Tables["Table2"].RowChanging += new DataRowChangeEventHandler(DetailRow_Changing);
private void DetailRow_Changing(object sender, DataRowChangeEventArgs e)
{
if (e.Action == DataRowAction.Add)
{
e.Row.Table.Columns["RelateNo"].DefaultValue = ds.Tables["Table1"].Rows[bindingSource1.Position]["RelateNo"].ToString();
}
}
我认为上述内容并不复杂。这些是我面临的问题:
我按下[新]按钮。将自动添加主服务器中的一行。我打字了。我单击DataGridView2中的左上角单元格。我打字了。我点击TAB几次或点击向下箭头键添加一个新行。我刚刚完成输入的第一行消失了。 DataGridView2上只剩下一个空行。我跟踪它并发现DetailRow_Changing()确实正确执行,这意味着添加了一行。因为Table1的RelateNo没有复制到Table2,使新添加的行远离过滤器。
与上述类似。我单击DataGridView2中的左上角单元格。我按F2(KeyDown中的代码)打开一个对话框,我可以从中选择ProductId。关闭对话框后,我检查是否需要新的DataRow。如果是这样,我执行: DataGridView2.EndEdit(); CurrencyManager cm =(CurrencyManager)grid.BindingContext [DataGridView2.DataSource,DataGridView2.DataMember]; cm.EndCurrentEdit(); //添加一个DataRow
我通过以下方式验证是否添加了DataRow:
labelHint.Text = ds.Tables [" Table2"]。Rows.Count.ToString();
我尝试获取DataView
DataRowView drv = (DataRowView)acDataGridView1.Rows[DataGridView2.CurrentCell.RowIndex].DataBoundItem;
if (drv == null)
MessageBox.Show("null"); // This line was executed
else
{
int i = ds.Tables["Detail"].Rows.IndexOf(drv.Row);
ds.Tables["Detail"].Rows[i]["ProductId"] = WhatEverDialogBox.GetValue("ProductId");
bindingSource3.ResetBindings(false);
}
同样,RelateNo没有得到正确的值。一切都与默认值有关。我发现如果没有过滤DataTable,它可以正确获取默认值。过滤后的DataTabled有什么用?
答案 0 :(得分:0)
我把它放在bindingSource_PosionChanged()中。这是给出默认值的更好地方。但是ModifiedTime怎么样?可能是一小时前。