2014-02-17 3 views
0

프로그램 로직이 UI 스레드를 사용하여 무작위로 버튼 태그를 변경한다고 가정합니다.버튼 태그 사용

클릭 이벤트에서 사용할 수있는 버튼 태그 값은 신뢰할 수 있습니까? 즉, 이벤트 핸들러가 클릭 할 때와 같은 값일 것인가?

그렇지 않은 경우 안전 할 수있는 버튼 클릭 이벤트에 이벤트 별 매개 변수를 전달하는 가장 좋은 방법은 무엇입니까?

업데이트

추가 요청에 따라 예. (이것은 단지 이론적 인 것임을 기억하십시오). 이벤트는 버튼의 상태가 추진되고있는 버튼을 누름을 처리하는 클릭 이벤트 사이에 변경 될 수 있도록 GUI를 이벤트 큐에 쐐기 할 수 있습니다

Windows.Forms.Timer timer = new Timer(); 
timer.Interval = 1; 
timer.Tick += new EventHandler(timer_tick); 
timer.Start(); 

void timer_tick(object sender, EventArgs e) 
{ 
    this.button.Tag = Random.NextInt(100).ToString(); 
} 

void button_click(object sender, EventArgs e) 
{ 
    string s = (string)((Button)sender).Tag; 
    Console.WriteLine("Tag value as at button push: " + s); 
} 

다른 방법을 넣어, 질문은 아래로 비등?

+0

버튼 태그를 정의하십시오. 그리고 당신의 논리가 그것을 어떻게 바꿀 수 있습니까? Windows 응용 프로그램과 관련이 있습니까? – Miller

+0

실제로 저는 wpf를 사용하고 있습니다. 그러나 winforms 응답이 질문에 대해 충분히 유사하다고 가정합니다. 로직이 태그를 어떻게 변경하는지에 관해서는 태그 기반 타이머를 밀리 초로 변경하는 GUI 기반 타이머를 생각해보십시오. (이것은 이론적이다). – Nicholas

+0

버튼 태그에서 어떻게 변경하는지 예제를 제공 할 수 있습니까? – Miller

답변

0

winforms를 사용한다고 가정합니다.

IMHO Tag 속성을 사용하여 특정 컨트롤 매개 변수를 전달할 수 있지만 Windows 폼 컨트롤은 스레드로부터 안전하지 않다는 것을 기억해야합니다. 스레드로부터 안전한 호출을하려면 InvokeRequired을 사용해야합니다. 다음 링크는 TextBox의 텍스트를 스레드로부터 안전하게 설정하는 예제를 제공하지만 Tag 속성의 경우에는 그다지 다르지 않습니다. 이 도움이

http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

희망.

+0

내가 질문과 함께 전달하려고 시도한 것은 Tag 속성의 변경이 GUI 스레드를 통해 이루어 졌기 때문이며 다른 스레드는 아닙니다. 따라서 다중 스레드 안전성은 여기서 문제가되지 않습니다. 호출을하거나하지 않고 질문을 변경하지 않습니다. – Nicholas

+0

오, 죄송합니다. 나는 그 질문에 대해 오해했습니다. 어쨌든 IMO Tag 속성은 얻을 수있는만큼 신뢰할 수 있습니다. 필자는 컨트롤에 대한 더 많은 정보를 제공하기 위해 Tag 속성을 광범위하게 사용하여 이벤트 핸들러 내부에서 사용할 수 있도록했습니다. – samar