当把XmlFormView放到自己的aspx页面的时候,可能需要切换视图的逻辑,比如当流程绑定到表单库的时候,QuickFlow的FormServiceFormTask页面会按照任务活动的TaskFields中的__CurrentView字段来切换视图。
XmlFormView本身提供2个方法:
XmlViewer.XmlForm.ViewInfos.SwitchView("Approval")
XmlViewer.XmlForm.ViewInfos.Initial = XmlViewer.XmlForm.ViewInfos["Approval"]
但这两个方法或者出错,或者没用。
找到的最合理的方式是采用js切换,参考 http://www.moss2007.be/blogs/vandest/archive/2008/10/10/forms-server-xmlformview-and-setting-the-initialview-on-load.aspx
但这样会造成页面二次刷新。
没办法用Reflect分析代码,找到这个用反射设置视图的方法:
1)for SharePoint2007
void SwitchView12(string viewName) { if (String.IsNullOrEmpty(viewName)) throw new ArgumentNullException("viewName"); //check view exist. object viewInfo = null; try { viewInfo = this.XmlViewer.XmlForm.ViewInfos[viewName]; } catch { } if (viewInfo == null) { throw new NotSupportedException("view doesn't exist:" + viewName); return; } //利用反射控制 this.XmlViewer.XmlForm.Document.CurrentViewName System.Reflection.PropertyInfo pDocument = this.XmlViewer.XmlForm.GetType().GetProperty("Document", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (pDocument == null) { throw new NullReferenceException("can't get property XmlForm.Document"); return; } object objDoc = pDocument.GetValue(this.XmlViewer.XmlForm, null); if (objDoc == null) { throw new NullReferenceException("can't get value: XmlForm.Document"); return; } //objDoc.CurrentView = objDoc.Solution.Views[this._xmlFormHost.ViewInfos.Default.Name]; System.Reflection.PropertyInfo pCurrentView = objDoc.GetType().GetProperty("CurrentView"); //Debug("CurrentView: " + pCurrentView); System.Reflection.PropertyInfo pSolution = objDoc.GetType().GetProperty("Solution"); //Debug("pSolution: " + pSolution); object objSolution = pSolution.GetValue(objDoc, null); //Debug("objSolution: " + objSolution); IDictionary views = objSolution.GetType().GetProperty("Views", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(objSolution, null) as IDictionary; //Debug("views: " + views); object v = views[viewName]; //Debug("v: " + v); pCurrentView.SetValue(objDoc, v, null); }
此方法在OnInitlized方法中调用。
2)for SharePoint2010
以上方法在2010上应该也是可以的,但2010提供了一个更方便的方法:XmlFormView.DefaultView,
bool SwitchView14(string viewName)
{
var pDefaultView = XmlViewer.GetType().GetProperty("DefaultView");//只能在DataBind之前设置
//DefaultView属性可能是公共方法,这样就不必用反射了,但笔者是在2007下实现的这段代码,所以必须用反射
if (pDefaultView == null)
return false;
pDefaultView.SetValue(XmlViewer, viewName, null);
return true;
}
这个方法不同的是:不能在OnInitlized方法中调用,必须在XmlFormView DataBind之前调用。