2013-06-11 2 views
0

또 다른 일, 다른 이상한 InfoPath는 문제 사이의 큰 차이 ... 그래서InfoPath는 .NET ActiveX 컨트롤 reinstantiation - InfoPath는 2007/2010

, 나는 정의를 구축하고있어 액티브 X는이 자습서에 따라 C#으로 제어 - mhttp를 ://blogs.msdn.com/b/infopath/archive/2006/12/18/creating-complex-infopath-controls-in-c-sharp.aspx 및 http://blogs.msdn.com/b/infopath/archive/2005/04/15/creating-an-infopath-custom-control-using-c-and-net.aspx. 일반적으로 일들은 간단하며 간단한 값, XML 등을 반환 할 수있는 작업 컨트롤을 가지고 있습니다.

그러나 msdn 게시물에서 InfoPath는보기가 업데이트됨에 따라 컨트롤을 반복적으로 파괴하고 다시 인스턴스화합니다. 컨트롤에 상태를 저장할 수 없습니다. 그런 다음 InfoPath 2010에서 상태 (필드, 속성, .NET 컨트롤)를 컨트롤에 저장하고 양식을 제출할 때 xml에 저장할 수 있다는 사실에 놀랐습니다. 컨트롤 생성자에 MessageBox.Show()를 추가하는 이벤트 낯선 사람은 컨트롤이 을 반복적으로 사용하여을 반복적으로 나타내지 만 하나의 버전 만 사용자에게 액세스 할 수 있음을 나타냅니다. 컨트롤의 여분의 복사본이 인스턴스화되는 이유가 확실하지 않아 컨트롤이 복잡 해지면 심각한 성능 문제가 발생할 수 있습니다.

그래서 이제 InfoPath 2007에서 시도해 보겠습니다. 데이터가 변경 될 때마다 ActiveX 컨트롤이 실제로 파괴되고 다시 인스턴스화 (모든 상태 파괴)된다는 것을 알았습니다. 이것은 기본적으로 모든 상태가 새로 고쳐지면 컨트롤을 다시 채우기 위해 어딘가에 (아마도 xml 형식) 저장해야한다는 것을 의미합니다.

이것은 분명 InfoPath 2007/2010의 주요한 차이점이지만 분명히 설명서 또는 다른 언급은 찾을 수 없습니다. 위에 인용 된 기사는 꽤 오래되었고 정확하게 2007 년의 행동을 참조하십시오. 누군가가 이것에 대한 어떤 생각을 밝힐 수 있다면 나는 매우 감사 할 것입니다!

+0

이 변경 사항에 대한 설명서가 있습니다. http://msdn.microsoft.com/en-us/library/microsoft.office.interop.infopath.infopathcontrol2.refreshstate%28v=office.14%29.aspx - 꽤 숨겨져있어. InfoPath 2010 컨트롤은 InfoPathControl2를 구현하는 동안 InfoPath 2007 컨트롤에서 Microsoft.Office.Interop.InfoPath.InfoPathControl 인터페이스를 구현합니다. 후자에는 컨트롤이 새로 고쳐질 때 호출되는 RefreshState라는 추가 메서드가 있습니다. 이 메서드의 msdn 문서는 다음을 나타냅니다. – Tryptamine42

+0

* "InfoPath 2007에서 컨트롤이 바인딩되는 XML 노드가 변경되면 InfoPath에서 컨트롤에 구현 된 SaveState() 메서드를 호출하여 InfoPath에서 컨트롤을 파괴 할 수 있습니다. 컨트롤을 다시 만들 때 상태를 성공적으로 복원 할 수 있습니다 .A InfoPath 2010에서는 바운드 XML 노드가 변경 될 때 ActiveX 컨트롤이 항상 파괴되고 재구성되지 않도록 변경되었습니다. * – Tryptamine42

답변

0

이 변경 사항에 대한 몇 가지 문서를 발견했습니다 : http://msdn.microsoft.com/en-us/library/microsoft.office.interop.infopath.infopathcontrol2.refreshstate%28v=office.14%29.aspx - 꽤 숨겨져 있습니다.

그래서 InfoPath 2010 컨트롤이 InfoPathControl2를 구현하는 동안 InfoPath 2007 컨트롤은 Microsoft.Office.Interop.InfoPath.InfoPathControl 인터페이스를 구현합니다. 후자에는 컨트롤이 새로 고쳐질 때 호출되는 RefreshState라는 추가 메서드가 있습니다. 이 메서드의 msdn 문서는 다음을 나타냅니다. "InfoPath는 컨트롤이 바인딩 된 XML 노드가 변경되면 InfoPath에서 컨트롤에 구현 된 SaveState() 메서드를 호출하여 InfoPath에서 컨트롤을 파괴 할 수 있습니다 컨트롤을 재구성 할 때 컨트롤을 성공적으로 복원 할 수 있습니다 .AutPath 2010에서는 바운드 XML 노드가 변경 될 때 ActiveX 컨트롤이 항상 파괴되고 재구성되지 않도록 변경되었습니다.이 변경 사항을 완전히 구현하려면 InfoPath 2010에서 컨트롤에 바인딩 된 XML 노드에 대한 변경이 발생했으며 컨트롤이 XML 노드의 업데이트 된 정보를 읽음으로써 컨트롤의 상태를 새로 고쳐야 함을 나타냅니다.이를 수행하려면 컨트롤의 개발자가 RefreshState () 메서드를 컨트롤에. "

따라서 이것은 지정된 동작입니다.

Dispose() 메서드를 사용한 조사에 따르면 InfoPath 2010에서는 컨트롤의 새 복사본이 모든 편집시에 인스턴스화되지만 즉시 처리되므로 리소스를 차지하지 않습니다. 이 방법으로 구현 된 이유가 확실하지는 않지만 분명히 의도적 인 것이므로 안전해야합니다.

관련 문제