略過巡覽連結。
略過巡覽連結      
  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中即可。