2010-04-05 9 views
0

C# Winforms (3.5) 응용 프로그램에서는 길이가 긴 12 개의 프로세스에서 값을 저장하는 데 사용되는 많은 속성 (get/set)이 포함 된 클래스를 추가했습니다.Winforms 폼에 바인딩 된 개체에서 모든 속성 값 지우기?

형태 (12) 후 나는 형태 1.

에서 프로세스를 시작할 때 다음 사용자가 실수로 지울 수 있나요 값을 기록하지 않도록 저장 클래스의 모든 속성 값을 쓸어 싶습니다/파괴/클래스의 모든 속성 값을 삭제 하시겠습니까?

내 클래스는 다음과 같습니다

private static int battery; 
public int Battery 
{ 
    get { return storeInspectionValues.battery; } 
    set { storeInspectionValues.battery = value; } 
} 
+4

새 사용자가 이전 사용자의 목적과 아무 상관이 완전히 다른 개체가하지 않을까요하는 데 도움이? –

+6

배터리가 왜 정적입니까? – jjxtra

+0

Jeff/Kevin, 내 시도는 여러 번 액세스 할 수있는 준 유사 변수를 만드는 것입니다. 나는 가치 창고를 좀 더보아야 할 것이다. –

답변

16

가 대신 클래스의 새 인스턴스를 만들 수 있습니까? 당신은 정확히 같은 대상으로 끝날 것입니다. 의견에 응답

편집 :

이의 말을하자이 당신의 클래스입니다 :

public class Foo 
{ 
    private int _battery; 
    private string _someOtherValue; 

    public int Battery 
    { 
     get { return _battery; } 
     set { _battery = value; } 
    } 

    public string SomeOtherValue 
    { 
     get { return _someOtherValue; } 
     set { _someOtherValue = value; } 
    } 
} 

당신이 "/ 삭제 파괴/클래스의 모든 속성 값을 처분"하고 싶은 말은. 나는 이것이 모든 속성을 기본값으로 재설정하고자 함을 의미한다고 가정합니다.

foo.Battery = 0; 
foo.SomeOtherValue = null; 

같은 것은 이렇게하여 수행 할 수 있습니다 :

foo = new Foo(); 

이제 foo이 속성을 모두 기본 값이 인스턴스 인 즉,이 같은 것을 의미한다. 그게 당신의 문제를 해결합니까?

+3

간단하고 효율적입니다. –

+1

가장 확실하게; 효과적으로 전역 변수를 사용하는 대신 폼에서 폼으로 상태를 전달하는 것이 훨씬 쉽고 버그가 덜 발생합니다. – Aaronaught

+0

Aaronaught - 설명하는 내용을 더 자세히 설명하는 링크를 제공 할 수 있습니까? 나는 내가가는대로 배우고 있고, Bryan Watts와 나 자신이 제공 한 답은 나에게 분명하지 않다. –

3

새 인스턴스를 만드는 것이 좋지 않은 경우 값 매개 변수에 기본값을 지정하고 참조 매개 변수에 새 인스턴스를 할당하는 메서드를 구현할 수 있습니다.

+1

이것은 오래된 C++ 데이터 구조에있을 수있는 Clear() 메소드와 비슷합니다. – AaronLS

+0

감사합니다. Maurizio - 의견을 더욱 자세히 설명하는 링크가 있습니까? –

0

루프의 using statement을 사용하여 개체의 범위를 제한 할 수 있습니다.

while (i_still_have_more_users_to_process) 
{ 
    using (MyObject myObject = new MyObject()) 
    { 
    // Do stuff with forms and myObject 
    } 
} 
+2

-1. 클래스가'IDisposable'을 구현한다는 표시는 없으며, 그렇다고해도 필드/속성을 기본값으로 설정할 수있는 것은 아닙니다. – Aaronaught

+0

제발 이해 좀 도와주세요 - 새 MyObject를 만들면 해당 MyObject의 필드/속성이 기본값으로 설정되지 않습니다. 루프의 맨 위에 매번 객체를 새로 추가 할 수 있다는 사실보다 주석에 더 많은 것이 있습니까? 그리고 폐기해야 할 것이 있다는 증거가 없기 때문에 "사용"은 불필요합니다. – JeffH

1

클래스의 모든 속성 값을 "재설정"하는 메커니즘이 없습니다. 이것을 성취 할 수있는 방법이 있지만 (모든 속성 값을 명시 적으로 재설정하는 메소드를 작성하는 것), 똑바로 앞으로 (모든 속성을 찾고 반사 값을 설정하기 위해 Reflection을 사용하여) 순조로운 방법은 아닙니다. 당신이 성취하려고하는 것처럼 들리는 것을 위해 접근합니다.

데이터를 캡처하고 그 데이터를 어딘가에 제출 한 다음 삭제하는 사용자 인터페이스가있는 경우 대개 개체 지우기를 시도하지 않고 개체의 새 인스턴스를 만드는 것이 좋습니다.

예를 들어 속성에 고정 변수가 있음을 알았습니다. 특별한 이유가없는 한 변수를 비 정적으로 만들어야합니다. 그렇지 않으면 객체의 새 인스턴스를 만드는 것이 실제로 원하는 효과를 내지는 못합니다 (정적 변수와 비 정적 변수의 차이점을 읽음). 그게 너에게 의미가 없다면).

는 의견에 대한 응답으로 다음 코드 예제를 추가 :

당신은 생성자의 인자 또는 각 양식에 공공 재산으로 형태 사이에 데이터 개체를 전달할 수 있습니다.예를 들어, 코드는 다음과 같을 수 있습니다. 각 양식에는 클릭 할 때 현재 양식이 닫히고 동일한 데이터 오브젝트를 사용하여 다음 양식이 열리는 "다음"단추가 있습니다. MyDataClass 객체는 생성자 인수로 각 양식에 전달됩니다. 마지막 양식은 "다음"버튼을 대신 물론 데이터를 저장하는 "저장"버튼을 가지고하지 않습니다 즉, 당신이 절대적으로 정적 사용해야하는 경우

public partial class Form1 
{ 
    private MyDataClass _Data; 

    public Form1(MyDataClass data) 
    { 
     InitializeComponent(); 

     this._Data = data; 

     // TODO: initialize fields with values from this._Data 
    } 

    protected void btnNext_Click(object sender, EventArgs e) 
    { 
     // TODO: store field values to this._Data 

     // close this form 
     this.Close(); 

     // show the next form and pass the data object along to the next form 
     Form2 form = new Form2(this._Data); 
     form.Show(); 
    } 
} 

public partial class Form2 
{ 
    private MyDataClass _Data; 

    public Form2(MyDataClass data) 
    { 
     InitializeComponent(); 

     this._Data = data; 

     // TODO: initialize fields with values from this._Data 
    } 

    protected void btnNext_Click(object sender, EventArgs e) 
    { 
     // TODO: store field values to this._Data 

     // close this form 
     this.Close(); 

     // show the next form and pass the data object along to the next form 
     Form2 form = new Form2(this._Data); 
     form.Show(); 
    } 
} 

// ... 

public partial class Form12 
{ 
    private MyDataClass _Data; 

    public Form12(MyDataClass data) 
    { 
     InitializeComponent(); 

     this._Data = data; 

     // TODO: initialize fields with values from this._Data 
    } 

    protected void btnSave_Click(object sender, EventArgs e) 
    { 
     // TODO: store field values to this._Data 

     // TODO: save the data stored in this._Data, since this is the last form 

     // close this form 
     this.Close(); 
    } 
} 
+0

Dr. - 'new'키워드없이 클래스를 어떻게 참조합니까? –

+1

John, 내가 묻는 것을 이해하는지 확실하지 않습니다. 'new'키워드를 사용하여 클래스의 인스턴스를 만듭니다. 클래스의 인스턴스에는 동일한 클래스의 다른 인스턴스와 별도의 고유 한 변수가 있으므로 여러 인스턴스 (예제에서 양식을 채우려는 사용자 당 하나의 인스턴스)를 만들면 각 인스턴스의 데이터가 분리됩니다 . 그러나 클래스의 변수가 '정적'으로 정의되어 있으면 변수가 실제로 해당 클래스의 모든 인스턴스에서 공유된다는 의미입니다. 그것이 당신을 전혀 돕는 지 확실하지 않습니다. –

+0

Dr. - 저장소 클래스를 초기화 한 다음 12 개의 다른 형식 (각 인스턴스가 해당 인스턴스에 저장 됨)을 실행 한 다음 인스턴스의 값을 기록한 다음 인스턴스를 삭제/삭제하는 것이 가능한지 확실하지 않습니다. –

1

을하는 새로운 객체를 생성하는 것은하지 않습니다 (정적이기 때문에) 속성을 지울 수 있습니다 :

  • 정적 동작을 "시뮬레이트"하기 위해 싱글 톤 패턴을 사용합니다.
  • 응용 프로그램 도메인을 만드는 것이 좋습니다. 새 응용 프로그램 도메인이 만들어지면 정적 클래스 (속성 및 필드 및 기타 모든 항목 포함)가 다시 만들어지고 정적 생성자가 다시 호출됩니다.

희망이

관련 문제