2017-09-05 40 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怎麼樣?可能是一小時前。