내 form1-window에서 호출되는 객체가 있습니다. 이 객체 내에서 form1 객체 (예 : 레이블 또는 프로세스 막대)를 변경하려면 어떻게해야합니까?다른 개체 내에서 양식 구성 요소를 변경하려면 어떻게해야합니까?
답변
개체에 양식에 대한 참조를 제공하는 것은 좋지 않은 (원형) 디자인입니다. 인터페이스 또는 대리자 (콜백)를 사용하십시오.
// untested code
class MyObjectClass
{
public delegate void Reportback(int percentage);
public void DoSomething(Reportback callBack) { ...; callback(i*100F/total); ...}
}
class Form1: Form
{
private void reportProgress(int percent) { ...; progressbar1.value = percent; }
void SomeMethod() { myObject1.DoSomething(reportprogress); }
}
내가 헹크 동의 ...하지만 당신이 컨트롤의 가시성을 변경하는 경우 어쨌든, 당신이 양식에 항목을 수정할 수 있습니다, 심지어이 작업을 수행하는 속성이있다.
일반적으로 말해서 한 객체가 다른 객체의 비공개 필드를 조작해야하는 필요성을 느끼면 설계가 올바르게 작동해야합니다.
예를 들어, 일종의 장기 실행 비즈니스 로직을 수행하는 클래스는 ProgressBar
을 업데이트하지 않아야합니다. 첫째, 그건 그 직업이 아닙니다. 둘째, 비즈니스 로직의 기능과 사용자 인터페이스의 구현 세부 사항을 결합합니다.
클래스가 장기 실행 작업을 수행 할 때 단순히 이벤트를 발생시키는 것이 훨씬 좋습니다. 예를 들어,이 클래스를 보면 :
이 클래스의 모든 메소드는Progress
속성을 설정 때마다
public class BusinessLogic
{
public event EventHandler ProgressChanged;
private int _Progress;
public int Progress
{
get { return _Progress; }
private set
{
_Progress = value;
EventHandler h = ProgressChanged;
if (h != null)
{
h(this, new EventArgs());
}
}
}
}
이는 ProgressChanged
이벤트가 발생됩니다. 양식에서이 같은 논리로 객체를 생성 할 수 있습니다
private BusinessLogic Task;
private void Form1_Load(object sender, EventArgs e)
{
Task = new BusinessLogic();
Task.ProgressChanged += Task_ProgressChanged;
}
void Task_ProgressChanged(object sender, EventArgs e)
{
taskProgessBar.Value = ((BusinessLogic) sender).Progress;
}
이제 모든 시간은 Task
객체의 방법은 Progress
속성을 설정, 형태로 ProgressBar
업데이트 얻을 것이다.
이 코드는 객체를 ProgressBar
으로 업데이트하는 것보다 쓰기가 훨씬 쉽습니다. 그러나 당신이 그것에서 벗어나는 것을보십시오. 양식을 두 가지 양식으로 리팩토링하고 작업을 새 양식으로 이동해야하는 경우 BusinessLogic
클래스를 만질 필요가 없습니다. ProgressBar
을 양식의 컨트롤에서 ToolStrip
의 ToolStripProgressBar
으로 이동하면 BusinessLogic
클래스를 만질 필요가 없습니다. 진행보고가 중요하지 않다고 결정하면 BusinessLogic
클래스를 만질 필요가 없습니다.
기본적으로이 접근법은 BusinessLogic
클래스가 사용자 인터페이스에 대해을 알아야하는 것을 방지합니다. 따라서 프로그램이 발전함에 따라 비즈니스 로직과 사용자 인터페이스를 쉽게 변경할 수 있습니다.
- 1. C 코드 내에서 Linux 사용자를 변경하려면 어떻게해야합니까?
- 2. sfDoctrineGuardPlugin에서 양식 서식 파일을 변경하려면 어떻게해야합니까?
- 3. 다른 구성 요소 내부의 구성 요소를 페인팅
- 4. 양식 디자이너에서 구성 요소를 사라지게하려면 어떻게합니까?
- 5. Flex 3에서 박스 구성 요소 방향을 변경하려면 어떻게해야합니까?
- 6. 하나의 Makefile로 다른 버전의 구성 요소를 효율적으로 빌드하려면 어떻게해야합니까?
- 7. Settings.settings - 한 환경에서 다른 환경으로 변경하려면 어떻게해야합니까?
- 8. Hgroup - 요소 순서를 변경하려면 어떻게해야합니까?
- 9. 구성 요소를 다른 레이어의 다른 클래스로 구성 할 수 있습니까?
- 10. 하나의 구성 요소를 다른 구성 요소 위에 표시
- 11. TextBlock 텍스트 배치가 다른 구성 요소를 푸시합니다.
- 12. Grails/Compass - compqass Connection이 다른 디렉토리를 가리 키도록 변경하려면 어떻게해야합니까?
- 13. C++ Builder에서 시각적으로 구성 요소를 디자인하려면 어떻게해야합니까?
- 14. DataGrid에서 글꼴을 변경하려면 어떻게해야합니까?
- 15. wxRadioButton의 전경색을 변경하려면 어떻게해야합니까?
- 16. Joomla 1.5에서 구성 요소를 만들려면 어떻게해야합니까?
- 17. 마우스 위치를 감지하도록 구성 요소를 만들려면 어떻게해야합니까?
- 18. ListGridRecord의 Canvas 구성 요소를 얻으려면 어떻게해야합니까?
- 19. 플래시 구성 요소를 보호하고 라이센스를 부여하려면 어떻게해야합니까?
- 20. Flex에서는 탭 순서에서 구성 요소를 제거하려면 어떻게해야합니까?
- 21. scala.swing에서 컨테이너에서 구성 요소를 제거하려면 어떻게해야합니까?
- 22. WPF 요소를 이전에 회전하지 않고 크기를 변경하려면 어떻게해야합니까?
- 23. 개체 내에서 액세스 개체 이름이
- 24. 커서 이미지의 위치를 변경하려면 어떻게해야합니까?
- 25. 다른 활동의 구성 요소를 차단하는 애니메이션보기
- 26. 다른 구성 요소를 dataGrid에 배치하는 방법
- 27. jquery 양식 요소를 배열
- 28. 게시 된 컨트롤러에서 mvc ajax 양식 매개 변수를 변경하려면 어떻게해야합니까?
- 29. JComboBox의 UI를 변경하려면 어떻게해야합니까?
- 30. 컨트롤의 불투명도를 변경하려면 어떻게해야합니까?
가시성으로 범위 (개인, 보호 된, 공개)에 대해 이야기하고 있습니까? – HardCode
예. 공개 또는 내부로 변경하면 액세스 할 수 있습니다. 프로젝트에서이 접근법을 사용하지만 지저분하므로 오늘 Henks 솔루션을 사용하여 리펙토링합니다. –
그래, 내가 말할거야. 폼 컨트롤 자체를 공개하는 것은 끔찍한 이상입니다. 최악의 경우 개인/보호 된 양식 컨트롤을 설정하는 양식 코드에서 공용 함수를 작성해야합니다. – HardCode