无法为过滤的表格

时间:2017-09-05 08:52:22

标签: c#

我今天刚刚报名参加。我多年来一直在编写和维护我公司的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();
  }
}

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

  1. 我按下[新]按钮。将自动添加主服务器中的一行。我打字了。我单击DataGridView2中的左上角单元格。我打字了。我点击TAB几次或点击向下箭头键添加一个新行。我刚刚完成输入的第一行消失了。 DataGridView2上只剩下一个空行。我跟踪它并发现DetailRow_Changing()确实正确执行,这意味着添加了一行。因为Table1的RelateNo没有复制到Table2,使新添加的行远离过滤器。

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

  3. 我通过以下方式验证是否添加了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有什么用?

1 个答案:

答案 0 :(得分:0)

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