在Navigator按下更改時,要預設的欄位值,也寫在哪個Event?
為了集中在Navigator中管理,須配合將InfoBindingSource.AutoDisibleControl=True,這樣User才不會任意直接去TextBox中來編輯資料,錯過了Navigator按下Edit的時機,因此就可以將這個功能做在Navigator的AfterItemClick事件中,把更改後的預設值寫進InfoBindingSource,如下:
if (e.ItemName == "Edit")
{
infoTextBox1.Text= “測試”;
}
在InfoNavigator中,如果需求符合某一條件時才能刪除,應如何處理?
有2個方法,說明如下:
1. 用navigator的刪除來控制,可以在BeforeItemClick中寫如下程式:
if (e.ItemName == "Delete")
{
if (not 你的條件)
{
Messagebox.Show(“無法刪除!”);
e.Cancel = true;
}
}
2. 在Master或View的(如果有view的話,可以用view)BindingSource的PositionChanged事件以及InfoNavigator的StateChanged事件去判斷,如下:
if (not 你的條件)
{
bindingNavigatorDeleteItem1.enable=false;
}
else
{
bindingNavigatorDeleteItem1.enable=true;
}
Master/Detail中,如何控制沒有輸入明細檔時,提示「請輸入明細檔」並且不會存檔?
可以在Navigator的BeforeItemclick事件來控制,如下:
if (e.ItemName == "Apply")
{
if (ibsDetail.List.Count == 0) e.Cancel = true;//不存檔;
}
使用View+Mater/Detail的操作介面時,若是在新增/更改狀態時, 如何控制User不要去點選到View的DataGridView上,否則輸入的資料會被迫取消?
可通過Navigator的ViewScrollProtect屬性設為True即可,此可控制在編輯資料時,View的DataGridView無法被點選或操作。
bindingNavigatorCountItem 可以顯示實際Query的總筆數嗎,而不是PacketRecords筆數?
可以,只要將InfoNavigator的GetRealRecordsCount屬性設為True。
如何用程式觸發infoNavigator上的EditItem按下事件(Click),不是由User來按下該Button?
可通過infoNavigator1.EditItem.PerformClick();完成。
infoNavigator的BeforeItemClick跟AfterItemClick這兩個事件與Navigator內各Button內的事件的執行先後次序為何? 用途而在?
Navigator的事件順序:
1. BeforeItemClick;當您點擊Navigator上的button時最先執行這裏的程式,如果您在事件中設定e.Cancel等於true,就會導致Button本身的功能失效。可以用來控制條件式的執行某些Button,比如符合某條件才能新增,刪除,存檔,編輯等。
2. Navigator內Button本身的Click事件,這個事件是執行Navigator上每個button的功能,比如Apply按鈕的ApplyUpdates,Query按鈕的查詢,Add按鈕的新增。這部分功能是否執行,要看BeforeItemClick的e.Cancel是否為true,如果為true就不執行,如果為false就執行,而Button自己的Click事件不是由開發者可以自行控制的,是由EEP的元件本身所控制,除非去改寫或繼承此元件。
AfterItemClick事件;這個事件觸發時,每個button的功能都已經完成或者取消(因為e.Cancel=true),是最後一個事件。一般可以做一些收尾的工作,比如refresh一下讓Server端更改的資料同步顯示,或者已經存檔成功了,要做其他的操作等等。
infoNavigator各Button上顯示為何是英文,不是中文?
可以設定CliUtils.fClientLang = SYS_LANGUAGE.TRA,在開啟form之前,比如EEPNetClient的主畫面開啟的時候設置。並檢查一下InfoNavigator的GetServerText屬性是否設定為True。
如何控制InfoNavigator中自行增加的Button的Enable狀態?
如果是要Navigator的按鈕按下後來自行設定Button的狀態者,可以寫在navigator的AfterItemClick事件中,比如:
if (e.ItemName = "Confirm" && InfoTextBox1.Text == "..") // 配合每個的欄位內容值
button1.Enabled = true;
按下「刪除」鈕後,已詢問Y/N了,為何還要再按下存檔鈕呢?可否按下Y即刪儲存檔呢?
InfoBindingSource有AutoApply屬性,如果為True時,刪除時按OK鍵後都會自動存檔,所以這個確認框是為了配合AutoApply為True的情況。
如何實現正在編輯某資料時,Navigator不能移到View中其他筆資料中?
請將Navigator的ViewScrollProtext屬性設為true即可。
單檔GridView中編輯多筆資料時,為何修改兩筆CheckBox後存檔,只會存第一個入資料庫?
只有單檔多筆編輯且直接點擊Apply的時候會?生這個問題(如果點擊OK再存檔就不會),解決辦法可以在navigator的BeforeItemClick寫如下程式:
if (e.ItemName == "Apply")
{
grdView.EndEdit();
}
10. Q: 為何在表單打開後,infoNavigator的修改功能就不能使用,如何解決?
這是因為Navigator進入的某一個狀態下所造成的現象,為了保證打開表單將Navigator設定為流覽模式,可以在Form_load事件中加上以下程式:
infoNavigator1.SetState("Browsed");
infonavigator1如果有查詢Leftjoin過來的欄位,會把它誤認為是原表的欄位而導致錯誤,應該如何解決?
注意不要使用 select A.*,B.* from A leftjoin B on A.Id=B.Id 這樣的語法,如果要查詢join進來的欄位,必須在select語句有存在此欄位,否則無法判斷欄位屬於哪個table的,
如:select A.*,B.field1,B.field2 from A left join B on A.Id=B.ID
重點是要把要查詢的欄位一定要特別加上Table名稱, 順序也要調整(就是主檔要在前面,Join的欄位在後面,這也是要特別註意的),不然查詢就會有問題。
如何控制某個欄位在新增時可以輸入,修改時不可輸入?
如果此欄位是Server端的InfoCommand定義的key欄位,則在InfoBindingSource中設定DisableKeyFields屬性為true即可。但如果此欄位不是定義的keyfields,或者keyFields有多個,只有這個欄位元需要做此處理,則在Navigator的BeforeItemClick事件直接用程式處理比較好,如下:
在navigator的BefeoreItemClick事件中添加如下程式:
if (e.ItemName == "Edit")
{
infoTextBox1.Enabled = false;
}
else if (e.ItemName == "Add")
{
infoTextBox1.Enabled = true;
}
為何在SetWhere過濾資料後,InfoNavigator按鈕的狀態不對?
這是因為Navigator的button狀態改變需要時機,可以在Setwhere前後各增加一行程式,如下的範例:
InfoNavigator.SetState("Querying");
InfoDataSet.SetWhere(“你的Where條件”);
InfoNavigator.SetState("Browsed");
在InfoNavigator的QueryForm裡,如何動態控制某個RefVal內的WhereItem內容?(使用ClientQeury的模式)
需要先取得查詢屬性的Clientquery,由於是用Infonavigator實現的,所以要先用反射來取得Navigator中的ClientQuery,再取得這個Query form中的panel,然後按照命名規則就能取得你所要的查詢欄位之對應元件。然後再對這些元件進行whereItem設置。各個查詢元件的命名規則是txt加上流水編號,即txt0是第一個查詢欄位的元件。.
如:
ClientQuery cq = (ClientQuery)this.infoNavigator1.GetType().GetField("cqform", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this.infoNavigator1);
// 取出 infoNavigator內的ClientQuery對象
Panel pn = cq.ActivePanel;
InfoRefvalBox box = pn.Controls["txt0"] as InfoRefvalBox;
… // 取出InfoRefValBox後,即可控制該元件的屬性了。
在InfoNavigator新增一個按鈕來處理ClientQuery的自定查詢後,InfoNavigator上的按鈕狀態會異常?
在Navigator內現有的按鈕,我們都有精密處理過,並不是一個簡單的只有貼入button與設定Click事件而已,有兩種方法可以避免由此引起問題:
1. 使用我們的Query按鈕來執行你貼的Clientquery,雖然按鈕並沒有變Disible,但因違e.Cancel=true,所以後面不會執行系統內定的Query動作,改成你自己寫的程式,程式寫在Navigator的BeforeItemClick事件,如下:
if (e.ItemName == "Query")
{
ClientQuery1.Execute(); //接到自己的ClientQuery
e.Cancel = true; // 取消後面的內定Query動作
}
2. 這種方法更簡單,直接設定Navigator的QueryMode?ClientQuery,不要用自己的ClientQuery,將查詢欄位設定在Navigator的QueryField中即可。
在DesignTime無法使用infoNavigator1的屬性states,點擊後會出現"並未將物件參考設定為物件的執行個體?
請將原有的infonavigator刪除並重新貼一個infonavigator。