InfoPath开发经验小节
InfoPath采用XML存儲數據。
開發人員可以使用thisXDocument對象對InfoPath的數據進行訪問。
1? 訪問field數據,需要注意的是要先設置XPath和Namespaces
??????????? tempDom = (IXMLDOMDocument2)thisXDocument.DOM;
??????????? tempDom.setProperty("SelectionLanguage", "XPath");
??????????? tempDom.setProperty("SelectionNamespaces",
??????????????? "xmlns:dfs=\"" + "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" +
??????????????? "\" xmlns:my=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-12T03-20-30\"");
??????????? nodeEntry = tempDom.documentElement.selectSingleNode("my:Name");
?2 修改field數據
??????????? nodeEntry.text = "123";
3 插入group節點.
這里,我們先取得第一個Tasks節點。克隆此節點,然后把這個節點插入。最后,刪除原來的Tasks節點。
??????????? IXMLDOMDocument2 tempDom;
??????????? IXMLDOMNode nodeEntry;
??????????? tempDom = (IXMLDOMDocument2)thisXDocument.DOM;
??????????? tempDom.setProperty("SelectionLanguage", "XPath");
??????????? tempDom.setProperty("SelectionNamespaces",
??????????????? "xmlns:dfs=\"" + "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" +
??????????????? "\" xmlns:my=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-12T03-20-30\"");
??????????? nodeEntry = tempDom.documentElement.selectSingleNode("my:Tasks");
??????????? IXMLDOMNode node;
??????????? node = nodeEntry.cloneNode(false);
??????????? IXMLDOMNodeList list = tempDom.documentElement.selectNodes("my:Tasks");
??????????? try
??????????? {?? nodeEntry.parentNode.appendChild(node);
??????????????? //需要注意的是如果要刪除原來的Tasks節點,需要在appendChild新節點后進行。否則,當刪除了所有Tasks節點后,appendChild(node)會失敗。
??????????????? foreach (IXMLDOMNode nd in list)
??????????????? {
??????????????????? nodeEntry.parentNode.removeChild(nd);
??????????????? }
??????????? }????????????
??????????? catch (Exception ex)
??????????? {
??????????? }
??在開發中,又遇到了問題。如果你修改了group節點的一些屬性,具體是那些屬性忘了,調用appendChild(node)會失敗,解決的方法是使用insertBefore方法代替。
4 動態改變web的調用地址
我用一個field來保存要調用webservice的url地址,在啟動時讀入,在調用時修改dataobject的url
??????? public void OnLoad(DocReturnEvent e)
??????? {
??????????? // Write your code here.
??????????? IXMLDOMNode node = e.XDocument.DOM.documentElement.selectSingleNode("my:txtWebSiteURL");
??????????? this.WebSiteURL = node.text;
??????? }
????????private void ApplyWebServiceURL(DataObject dataObj)
??????? {
??????????? WebServiceAdapter adp = dataObj.QueryAdapter as WebServiceAdapter;
??????????? XmlDocument doc = new XmlDocument();
??????????? doc.LoadXml(adp.Operation);
??????????? XmlNode node = doc.SelectSingleNode("//@serviceUrl");
??????????? node.Value = this.WebSiteURL;
??????????? adp.Operation = doc.OuterXml;
??????? }
5?調用web service
??????????? //找到要調用的dataconnect
??????????? DataObject dataObj = (DataObject)thisXDocument.DataObjects["SaveEvent"];
??????????? if (dataObj == null)
??????????? {
??????????????? thisXDocument.UI.Alert("The data connect SaveEvent does not exist.");
??????????????? return null;
??????????? }
??????????? //設置Web service的輸入參數,這里我要把整個xml數據作為輸入參數
??????????? IXMLDOMNode nodeEntry;
??????????? try
??????????? {
??????????????? nodeEntry = dataObj.DOM.selectSingleNode("/dfs:myFields/dfs:queryFields/tns:SaveEvent");
??????????????? nodeEntry.selectSingleNode("tns:input").text = dataObj.DOM.xml;
??????????? }
??????????? catch (Exception ex)
??????????? {
??????????????? string err = ex.Message;
??????????? }
??????????? //調用Web service
??????????? this.ApplyWebServiceURL(dataObj);
??????????? dataObj.Query();
??????????? //得到Web service的返回值,是一個xmldocument,包括projectID,eventID兩個值
??????????? IXMLDOMNode nodeResult = dataObj.DOM.selectSingleNode("/dfs:myFields/dfs:dataFields/tns:SaveEventResponse/tns:SaveEventResult");
??????????? string projectID,eventID;
??????????? projectID = nodeResult.selectSingleNode("//ProjectID").text;
??????????? eventID = nodeResult.selectSingleNode("//EventID").text;
6 設置web service的超時長度
我的web service有時會很慢,系統默認的time out=30秒,這就導致我的form常常在調用時發生超時的異常。下面的代碼將超時長度設置為120秒。
??????????? DataObject dataObj = (DataObject)thisXDocument.DataObjects["CheckAllResources"];
??????????? WebServiceAdapter2 adp = dataObj.QueryAdapter as WebServiceAdapter2;
??????????? adp.Timeout = 120;
?7 用代碼控制button的狀態
?我的infopath需要根據當前用戶的角色來控制用戶的操作,具體就是如果用戶有保存權限,Save按鈕處于Enable狀態,否則將Save按鈕設置為disable狀態。
InfoPath 的按鈕都有conditional formating功能,我們可以根據conditional formating的結果來控制按鈕的狀態或字體顏色等顯示屬性。conditional formating提供了簡單的計算,如myfield1的值是否等于1;或當前用戶的role是否等于某一個角色。
如果這些簡單的計算不能滿足你的需要,還有一種xdExtension的計算方式,是可以調用你自己的代碼。
1)首先需要在你的代碼中定義一個計算函數,我這里的函數是取一個field的bool值并返回
??????? public bool SaveEnable()
??????? {
??????????? string enable = thisXDocument.DOM.selectSingleNode("/my:myFields/my:SaveEnable").text;
??????????? if (enable.ToUpper() == "TRUE")
??????????? {
??????????????? return true;
??????????? }
??????????? else
??????????? {
??????????????? return false;
??????????? }
??????? }
2) 定義按鈕的conditional formating,
在按鈕上右鍵菜單選擇
button properties -> Display? ->? Conditional Formatting... ->? Add,
在對話框中設置條件,左側下拉選擇The expression, 然后輸入:
xdExtension:SaveEnable() != string(true())
選中Disable this control,然后確定。
8。 處理允許為空字段。在向允許為空字段內寫入數據時,需要將節點的xsi:nil屬性刪除
nodeEntry.attributes.removeNamedItem("xsi:nil");?
?
?9。巧用web service提高啟動速度
我的項目中使用 InfoPath 2003作客戶端,由于我的表單上有很多的dropdown list,在啟動時非常慢。經過一個小的調整,啟動速度快多了。
原來,每一個dropdown list數據源都是一個獨立的data connect,連接到服務器的web service。因此,每次啟動時,要依次初始化dropdown list,每個dropdown list都會調用一次web service,而web service是很慢的。造成啟動速度慢。
為了提高速度,我調整了data connect,為所有的dropdown list建一個web service,將原來每個web service的返回結果添加到一個xml的根下面,這樣,整個啟動期間只要調用一次就可以了。
例如,我原來有2個dropdown list,分別是部門和人員,對應服務器端兩個web service,
public XmlDocument GetDepartments(),? public XmlDocument? GetContacts()。
現在,我在服務器端增加一個web service方法public XmlDocument GetInitData(), 這個方法的返回值是一個xml文檔,里面有兩個子節點,一個存放GetDepartments的結果,另一個存放GetContacts的結果。需要注意的是,一定要保證各個數據結果集的名字是不重復的。如果使用的是DataSet直接轉換的xml,需要保證每個表的名字是不重復的。
最基本卻最容易被忽視的設計原則上:
1 減少交互次數
2 減少數據傳輸量。
?
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的InfoPath开发经验小节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 群集环境
- 下一篇: ADSL断流问题分析