8

이 질문에는 이미 답변이 있습니다.

내 응용 프로그램에서는 버튼의 가시성, 텍스트 필드의 enabeling 및 winform 헤더 텍스트를 제어하기 위해 서로 다른 컨텍스트에서 동일한 winform을 실행하고 있습니다. 이 작업을 수행하기로 결정한 방식은 문자열을 양식 생성자에 전달하고 if 문으로 원하는 Winform Tweak가 포함되어 있는지 확인하는 것입니다.

if (formContext == "add")
{
    Text = "Add member";
}
if (formContext == "edit")
{
    Text = "Change role";
    userTextBox.Enabled = false;
    searchButton.Visible = false;
}

이것은 정상적으로 작동하지만 "텍스트"키워드는 다음 메시지와 함께 ReSharper에 의해 추가 된 파란색 줄임표를 얻습니다. 생성자의 Viritual member call. 이것은 잠재적 인 문제인가 아니면 지나치게 열정적 인 ReSharper 메시지일까요?

내 구현을 개선하기위한 모든 설명이나 제안은 많은 도움이 될 것입니다.

4 답변


9

기본 클래스 ctor의 가상 멤버 호출할 수 있었다서브 클래스의 ctor가 호출되기 전에 (따라서 객체가 일관된 상태로 자신을 초기화 할 수있는 기회를 갖기 전에) 일부 논리를 서브 클래스에서 실행하게합니다.

그것은 좋은 알림이므로 잠재적으로 예기치 않은 예기치 않은 행동을 유발할 수있는 일을한다는 것을 알고 있습니다.


  • 네 ... 이것은 제가 생각하고있는 라인을 따라 있습니다. 어떻게하면 더 잘할 수 있을지에 대한 제안. 안정성은이 프로젝트에서 최우선 순위이며 예상치 못한 동작을 피하는 것이 좋습니다. - Sakkle
  • 기본 클래스 ctor에서 가상 메소드를 호출하지 않는 것 외에 제안이 있습니까? :-)이 상황에서는 데이터 바인딩을 사용하여 양식의 Text 속성을 GUI 모델 클래스의 문자열 필드에 바인딩 한 다음 제목 표시 줄의 의미를 결정하는 데 필요한 논리를 포함 할 수 있습니다. - mookid8000
  • 예 ... 어디서부터 시작해야할지 모르지만 버튼과 텍스트 입력란에 대해 동일한 작업을 수행해야합니다. - Sakkle

6

폼에 대한 기존 답변 외에도 Load 이벤트 핸들러를 추가 할 수 있습니다.

Load += delegate
{
    if (formContext == "add")
    {
        Text = "Add member";
    }
    if (formContext == "edit")
    {
        Text = "Change role";
        userTextBox.Enabled = false;
        searchkButton.Visible = false;
    }
};


  • 이것은 많은 코드를 다시 작성하지 않고도 내가 성취하려고하는 것에 대한 가장 쉽고 최고의 솔루션 인 것 같습니다. 예 ... 저는 게으르다. P - Sakkle

4

수업을 봉쇄하십시오.



0

다음과 같이 수업을 다시 작성하시는 것이 좋습니다.

public partial class Form1 : Form
{
    public enum FormContextMode
    {
        Add,
        Edit
    }

    private FormContextMode m_mode = FormContextMode.Add; 

    public Form1( FormContextMode mode )
    {
        InitializeComponent();
        m_mode = mode;
        Load += delegate { UpdateForm(); };
    }

    private void UpdateForm()
    {
        if( m_mode == FormContextMode.Add )
        {
            Text = "Add member";    
        }
        else if( m_mode == FormContextMode.Edit )
        {
            Text = "Change role";
            userTextBox.Enabled = false;
            searchkButton.Visible = false;
        }
    }
}


  • 아하아 ... 달콤한 :) - Sakkle
  • 자체 Load 이벤트에 가입 할 필요가 없으며 OnLoad 메서드를 재정의하면됩니다. - Ilya Ryzhenkov
  • 네, Ilya에 동의합니다.이 방법에 과부하를 걸면 이벤트를 구독 취소하는 것을 기억해야합니다. (그리고 이것은 딱딱한 느낌입니다.) 아마도 더 빠를 것입니다. - ng5000
  • 두 번째 답변을 작성하지 마라. 혼란 스럽다. 이 답변 자체는 " 개선을위한 모든 설명 또는 제안 "을 충족하지 못합니다. 문제의 요구. - bzlm
  • 원래 답변이 삭제되었으며이 답변으로 대체되었습니다. 표시된대로 업데이트되었습니다. - ng5000

연결된 질문


관련된 질문

최근 질문