2017-09-05 56 views
0

我今天刚刚注册。我一直在编写和维护我公司的Delphi ERP计划多年。去年,我的老板想让我用C#重写整个ERP。我花了好几个月的时间来学习和构建我的基本C#代码。一切顺利。 Delphi技能有助于C#编码。无论如何,它仍然是Windows程序。但是当涉及到主从结构时,我陷入了沼泽。无法给已过滤的表格设置默认值

这是使用Delphi编写主从程序的一块蛋糕。我唯一需要的是过滤器。与C#不同,Delphi DataGrid的行数始终与对应表的行数相同。因为我使用过滤器来实现Delphi中的主要细节,所以我用C#做了同样的事情(我没有使用关系),结果是一团糟。

我实现主细节的方式有什么问题?我必须使用关系吗?我愿意使用关系,因为有时我想访问表中的所有行。否则,任何人都可以给我一个主细节的好例子吗?

为了节省您的时间,我只是概述一些事情。

主:DataGridView1 < - BindingSource1 < - 表1

细节:DataGridView2 < - BindingSource2 < - 表2

KeyColumn:内部dataGridView1_SelectionChanged RelateNo

滤波器():

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(); 
    } 
} 

我认为上述并不复杂。这些是我面临的问题:

  1. 我按下[新]按钮。主机中的一行将自动添加。我输入了一些东西。我单击DataGridView2中左上角的单元格。我输入了一些东西。我打了几次TAB或点击向下箭头键添加一个新行。我刚刚输入的第一行消失了。 DataGridView2上只剩下一个空行。我追踪它并发现DetailRow_Changing()确实正确执行,意味着添加了一行。 Beacuse Table1的RelateNo没有复制到Table2,使新添加的行从过滤器中滑落。

  2. 与上面类似。我单击DataGridView2中左上角的单元格。我按F2(KeyDown中的代码)调出一个对话框,我可以从中选择一个ProductId。关闭对话框后,我检查是否需要新的DataRow。如果是这样,我执行: DataGridView2.EndEdit(); CurrencyManager cm =(CurrencyManager)grid.BindingContext [DataGridView2.DataSource,DataGridView2.DataMember]; cm.EndCurrentEdit(); //添加一个的DataRow

我确认一个DataRow通过加入:

labelHint.Text = ds.Tables [ “表2”] Rows.Count。的ToString();

我试图让数据视图

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

您使用的是什么UI框架? WPF或Windows窗体? –

回答

0

我把它放在bindingSource_PosionChanged()中。这是给出默认值的更好的地方。但是ModifiedTime怎么样?可能是一小时前。