這涉及一個表單上的批準欄位。在資料庫中,它是一個bool欄位,一個包含批準者FK的int欄位,以及一個日期-時間欄位,它們共同表明某件事情是否被批準,如果被批準,那么誰批準了它,什么時候批準。在表單中,這必須轉化為類似于 "John Smith于01/02/03 04:05批準 "的內容。
我通過一個導航欄來處理這個問題。當系結源的位置發生變化時,事件被捕獲,代碼將計算欄位格式化,就像這樣(代碼做什么并不重要)。
private void ctlNavBar1_displayCurrent(object sender。EventArgs e)。
{
var drv = talsBindingSource.Current as DataRowView;
if (drv != null)
{
ctlBoundCheckButton1.lblText = $"提交 {drv.Row. Field<DateTime>("SubmitDate").ToString("MM/dd/yy hh:mm tt")}"。
ctlBoundCheckButton1.setControls(true)。
if (drv.Row.Field<bool>("Approved")
{
var sup = talsSupervisorsBindingSource.Current as DataRowView;
ctlBoundCheckButton2.lblText = $"Approved by {sup.Row. Field<string>("FullName")} on {drv. Row.Field<DateTime>("ApproveDate").ToString("MM/dd/yy")}"。
ctlBoundCheckButton2.setControls(true)。
}
}
elseusing (DialogCenteringService centeringService = new DialogCenteringService(this))
{
MessageBox.Show("No TALs to Approve", "Confirm", MessageBoxButtons.OK) 。
}
關閉()。
}
}
問題是
public TALsApprove()
{
InitializeComponent()。
talsTableAdapter.FillForApproval(timeTrackDataSet.TALs, User.ID)。
usersTableAdapter.FillBySupervisor(timeTrackDataSet.Users, User.ID)。
timeSlipsTableAdapter.FillBySupervisor(timeTrackDataSet.TimeSlips, User.ID)。
ctlNavBar1.displayCurrent = ctlNavBar1_displayCurrent;
ctlNavBar1.bindingSource = talsBindingSource;
//這個賦值并沒有觸發Position Changed(或其他任何東西,據我所知)。
}
系結源事件PositionChanged在第一次分配系結源時并沒有觸發。我已經通過使用表單的 "顯示 "事件解決了這個問題,就像這樣。
private void TALsApprove_Shown(object sender, EventArgs e)。
{
ctlNavBar1_displayCurrent(null, new EventArgs()) 。
因此我的問題是:
1.- 像這樣直接呼叫事件處理程式是否會破壞.NET的任何內部結構?(例如,記憶體泄漏、堆疊問題等)
2.--是否可以直接呼叫事件處理程式?
2.- 是否有一種不那么笨拙的方式來處理系結源首次初始化時的欄位計算,以及當前記錄內容發生變化時的欄位計算?我試驗了系結源事件CurrentChanged和CurrentItemChanged,但是它們似乎過火了,甚至在沒有實際欄位值改變時也會啟動。
uj5u.com熱心網友回復:
我認為有幾種方法可以解決這個問題:
1 ) 使用計算列假設:
- 你有一個強型別的資料庫。
- 你有一個強型別的資料集,其中有兩個表,如應用程式和用戶 。
- 你在應用程式中有以下列。Approved(bool), ApproveDate(datetime), ApprovedByUserId(int)/li>
- 你在應用程式和用戶之間有一個單一的資料關系,將Applications.ApprovedByUserId(許多)映射到User.UserId(一個),并且UserId也是一個int 。
程序:
- 在你的資料集中,點擊你的應用程式表,并添加一個字串列 。
- 將其運算式屬性設定為類似的內容。
IIF([Approved] = False,'Not approved', 'Approved by' Parent.Username ' on ' [ApproveDate])
當你運行時,你將會發現你的資料被填入表格中。
讓我們來編輯一下資料化的問題:
讓我們在運行時編輯另一個細節:
當你完成編輯并移開該行時,它將被提交到表中,并且敘述會自動更新
。如果你沒有一個bool approved,你可以添加一個或使用一些其他的測驗,如IIF(ApprovedByUserId IS NULL,'Not Appproved,'App...')。如果你有多個來自應用程式的資料關系,你可以在Parent后面指定關系的名稱,如Parent(App_User).UserName`,假設資料關系被稱為App_User
沒有人說你只需要系結文本。如果你在你的資料集中有一個 "批準 "的bool列,你可以在一排有幾個標簽:
--label1----- --label2------ --label3- --label4--
"由"BindParentName "批準"BindDate
你可以將它們的每一個Visible屬性系結到Approved bool上,這樣如果用戶導航到一個未批準的行,標簽就會消失。
最簡單的方法是將父母的用戶名匯入到應用程式資料表中(因為所有這些標簽都被系結到位于應用程式表中的indingsource,對嗎?),在一個新的列上使用Expression,但更簡單(只是Parent.UserName或Parent(App_User).UserName`),將用戶名匯入到應用程式資料表中。
還有其他方法,涉及到多個系結到資料關系的系結源。我們甚至可以用一個組合框來做這件事--這個組合框有一個用戶表的資料源,但有一個來自應用程式表的 "ApprovedByUserId "的資料成員;它將執行ApprovedByUserId <--> UserId等價的2種查找方式
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309691.html
標籤:




