在程序中设置infopath中的整型等域值时出错解决方法
生活随笔
收集整理的這篇文章主要介紹了
在程序中设置infopath中的整型等域值时出错解决方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近一直和infopath表單打交道,碰到的問題也比較多,剛剛就碰到一個在程序中修改infopath表單中域的內容時出錯的問題,寫出來與大家共享一下,我想這個問題,可能玩infopath的話,遲早會碰上的吧。
具體表現就是在代碼中對一些值類型的域進行更改的時候,代碼報錯,出錯信息:"Schema validation found non-data type errors."
小弟對xml schema真的不是很了解,所以找了半天,最后總算在infopath team blog上找到標準答案
文章地址:http://blogs.msdn.com/infopath/archive/2006/11/28/the-xsi-nil-attribute.aspx
?
{
if?(node.MoveToAttribute("nil",?"http://www.w3.org/2001/XMLSchema-instance"))
??????node.DeleteSelf();
}
//?為主數據源創建一個Navigator對象
XPathNavigator?xn?=?this.MainDataSource.CreateNavigator();
//Create?a?navigator?object?for?the?field?(node)?
//where?we?want?to?set?the?current?date?value
//?為你要設置當前日期值的一個域(節點)創建一個navigator對象
XPathNavigator?xnfield1?=?xn.SelectSingleNode("/my:myFields/my:field1",?this.NamespaceManager);
//Check?if?the?"nil"?attribute?exists?on?this?node
//?檢查節點是否存在?“nil”屬性
DeleteNil(xnfield1);
//Create?a?new?dateTime?object?for?the?current?date
//?創建一個包含當前日期的新的dateTime對象
DateTime?curDate?=?new?DateTime(DateTime.Today.Year,?DateTime.Today.Month,?DateTime.Today.Day);
//Set?the?value?of?field1?to?the?current?date?in?the?
//correct?format:?yyyy-mm-dd
//?設置field1的值為使用”yyyy-mm-dd”格式的當前日期
xnfield1.SetValue(curDate.GetDateTimeFormats().GetValue(5).ToString());
具體表現就是在代碼中對一些值類型的域進行更改的時候,代碼報錯,出錯信息:"Schema validation found non-data type errors."
小弟對xml schema真的不是很了解,所以找了半天,最后總算在infopath team blog上找到標準答案
文章地址:http://blogs.msdn.com/infopath/archive/2006/11/28/the-xsi-nil-attribute.aspx
?
xsi:nil屬性
你是否曾經在程序中設置域值時碰到schema valiadation錯誤?很多時候這個錯誤的原因是節點定義了“nillable”屬性. Nillable屬性是一個特殊的屬性,它能出現在一個XML schema的 xsd:elment中.如果一個元素定義了xsi:nil屬性,意味著這個元素被定義了,但是沒有值,因此它是沒有內容的。
然而,如果你試圖在程序中給一個定義了nillable屬性的節點設置值,你會得到一個錯誤信息:“Schema validation found non-data type errors.”。你可能會發現nillable屬性常被定義在下面幾種數據類型上:
- Whole Number (integer)
- Decimal (double)
- Date (date)
- Time (time)
- Date and Time (dateTime)
要解決這個問題,你的代碼需要先檢測nil屬性是否被定義了。如果定義了,那需要在給節點設置值之前移除這個屬性。下面這段簡單的程序使用一個XpathNavigator類,檢查節點的node是否有nil屬性。如果存在則刪除掉。
public?void?DeleteNil(XPathNavigator?node){
if?(node.MoveToAttribute("nil",?"http://www.w3.org/2001/XMLSchema-instance"))
??????node.DeleteSelf();
}
上面這段代碼是通用的,你能很簡單的調用這段代碼在你需要編程改變一個域的值之前。下面是一個例子,這段代碼被一個按鈕的click事件調用。
//Create?a?Navigator?object?for?the?main?data?source//?為主數據源創建一個Navigator對象
XPathNavigator?xn?=?this.MainDataSource.CreateNavigator();
//Create?a?navigator?object?for?the?field?(node)?
//where?we?want?to?set?the?current?date?value
//?為你要設置當前日期值的一個域(節點)創建一個navigator對象
XPathNavigator?xnfield1?=?xn.SelectSingleNode("/my:myFields/my:field1",?this.NamespaceManager);
//Check?if?the?"nil"?attribute?exists?on?this?node
//?檢查節點是否存在?“nil”屬性
DeleteNil(xnfield1);
//Create?a?new?dateTime?object?for?the?current?date
//?創建一個包含當前日期的新的dateTime對象
DateTime?curDate?=?new?DateTime(DateTime.Today.Year,?DateTime.Today.Month,?DateTime.Today.Day);
//Set?the?value?of?field1?to?the?current?date?in?the?
//correct?format:?yyyy-mm-dd
//?設置field1的值為使用”yyyy-mm-dd”格式的當前日期
xnfield1.SetValue(curDate.GetDateTimeFormats().GetValue(5).ToString());
轉載于:https://www.cnblogs.com/pengyuan512/archive/2008/06/24/1228947.html
總結
以上是生活随笔為你收集整理的在程序中设置infopath中的整型等域值时出错解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用c++编写的植物大战僵尸
- 下一篇: this和arguments