2

현재 VS12 및 기본 제공 디자이너에서 문제가 발생합니다. 기본적으로 기본적인 사용자 컨트롤과 DevExpress 컨트롤을 확장하는 사용자 정의 컨트롤 프레임 워크를 사용하고 있습니다. 잠시 동안 지금 내가 속성을 변경하거나 컨트롤 중 하나를 이동하려고하면 디자인 모드에서 양식을 저장하는 데 문제가 있습니다. 오류 메시지를 가능한 한 잘 번역하려고했습니다 (VS의 독일어 버전 사용).C# VS12 디자이너가 디자인 모드에서 사용자 지정 파생 폼을 저장하는 중 오류가 발생했습니다.

Visual Studio Designer Error Message: 
Error during code generation for the MyPropertyMap-property. Error: The property accessor for the MyPropertyMap for the settings object has caused an exception: The enumeration has changed. Enumeration could not be executed. 

나는 가능 CLR 디버깅과 비주얼 스튜디오의 또 다른 인스턴스를 사용하여 디자이너의 예외를 디버깅하려고 :

System-InvalidOperationException 
The enumeration has changed. Enumeration could not be executed. 
Source: CustomForm 
StackTrace: MyNamespace.Controls.CustomForm.get_FormVariables() 
TargetSite: System.Collections.Hashtable get_FormVariables() 

디자이너 내가 숨기려 allthough 폼의 속성에 액세스하려고 할 것 같습니다 그것은 디자이너에서 다음 코드를 사용하여 : 내가 재산의 직렬화 문제가 발생할 수 있습니다 생각했기 때문에

[NonSerialized] 
private Hashtable formVariables = null; 
[EditorBrowsable(EditorBrowsableState.Never)] 
[Browsable(false)] 
public Hashtable FormVariables 
{ 
    get 
    { 
... 

내가 NonSerialized 필드를 추가했습니다. getter는 기본적으로 폼의 패널에있는 모든 컨트롤을 쿼리하고 해시 테이블에 추가합니다. 왜냐하면 내가 타이머 기반의 작업을하고 있기 때문입니다. 그러나 디자인 타임에는 디자이너가이 속성에 액세스 할 필요가 없습니다. 모든 제안을 어떻게 디자이너에서 숨길 수 있으며이 오류를 방지 할 수 있습니까?

다른 중요한 정보를 보내지 못한 경우 알려주십시오.

편집 :

여전히 문제의 원인을 찾으려고합니다. 내가 알게 된 한가지는 Visual Studio 디자이너 설정에서 코드 최적화 최적화를 비활성화하면 항상 오류가 발생한다는 것입니다. 내가 그것을 다시 활성화 할 때 폼을 저장하는 첫 번째 시도에서 한 번 오류가 발생하고 두 번째 시도에서 폼이 저장된다는 의미는 아닙니다. 나는 모든 시간을한다면 지금 당장 확신하지 못한다. 그러나 적어도 두어 동안 나는 그것을 시도했다.

열거 형 또는 다른 컬렉션 개체로 작업하는 모든 공용 속성은 현재 DesignMode에 있으면 null을 반환하도록 구현됩니다. 디자이너가 getter 함수에 액세스하려고 할 때 예외가 계속 발생합니다.

친절하게 제공합니다.

답변

0

getter에서 DesingMode 검사를 설정해야한다고 생각합니다. winforms 디자이너 인 AFAIK는 어떤 속성이 설정되었는지에 상관없이 속성에 액세스합니다.

+0

추가하는 것을 잊었습니다. 이상한 것은 getter에서 이미 수행을 막으려 고합니다. get {if (! this.DesignMode) {... if 블록의 outsite 난 단지 기본적으로 null의 개인 회원을 반환 null – monotonouz

+0

나는 새 라이브러리와 GUI 프로젝트를 재건하려고합니다. getter 함수를 디버깅하고 designmode의 설정을 시도하십시오. 왜 디자이너가 기본 코드 – monotonouz

0

디자이너는 기본적으로 디자이너 파일에있는 코드를 실행하려고합니다. 이로 인해 때때로 사용자 정의 컨트롤에서 문제가 발생할 수 있습니다. 특히 런타임시 컬렉션에 대한 예기치 않은 바인딩 또는 열거 형을 수행하는 경우 특히 그렇습니다. (새로 고침 방법 건너 뛰기) 대해 designMode가 활성화 된 경우 코드가 조기에 반환됩니다 여기

void timer_Tick(object sender, EventArgs e) 
{ 
    if(this.DesignMode) 
    return; 

    this.Refresh(); 
} 

: 당신은

MSDN에서 좋은 예를 확인 설계 시간을 사용하여 관련 코드를 건너 뛸해야합니다 . 이것은 디자이너가 가동 중이고 실행중인 응용 프로그램을 전혀 손상시키지 않을 때만 발생합니다.

+0

에 대한 액세스 권한을 가지고 있는지 알지 못하는 경우가 있습니다. 디자인 타임 확인이 작동하지 않을 수도 있습니다. 내 컨트롤을 업데이트했습니다. 실행 가능한 모든 곳에서 디자인 타임 확인을 구현했습니다. 이상한 점은 때때로 오류가 잠시 동안 발생하지 않고 다시 발생한다는 것입니다. 거기에 일부 오래된 코드 내 winforms 디자인 파일에 계속 실행되는 매달려 있습니까? 이미 생성 된 코드를 지우고 다시 생성하도록 vs를 강제 할 수 있습니까? – monotonouz

+0

모든 경우에 디자인 타임 확인을 위반하는 것이 무엇이든지 발생하지는 않습니다. 예를 들어 실시간 데이터에 의존하는 컨트롤에서이 문제가 발생했습니다. 컨트롤이 그려지는 동안 데이터가 업데이트되면 컬렉션 열거 예외가 발생합니다. – ChargerIIC

+0

나는 [this] (http://stackoverflow.com/questions/1166226/detecting-design-mode-from-a-controls-constructor) 스레드를 기반으로 한 디자인 타임 확인에 또 다른 옵션을 시도했다. 나는 IDesignerHost calss를 사용하여 Vaclav Svara가 제안한 방법을 사용하여 디자인 모드를 확인했습니다. 프로젝트를 시작할 때 메시지 상자에 디자인 모드가 표시되어 있지만 양식을 저장하기 위해 저장 버튼을 클릭하면 실행되지 않는 것처럼 보입니다. 즉, 메시지 상자가 없음을 의미합니다. 양식 저장에서 디자이너 코드 생성이 실제로하는 일은 무엇입니까? – monotonouz