2013-07-19 2 views
15

방금 ​​프로그래밍을 시작했고, WinForms를 사용하여 여러 개의 버튼을 클릭하여 흰색에서 초록색으로, 다시 흰색으로 바꿀 수 있습니다. 나는 하나 개의 버튼에 대한 이런 짓을했는지 :버튼을 똑같이 만드는 방법은 무엇입니까?

private void button1_Click(object sender, EventArgs e) 
    { 
     if (button1.BackColor != Color.Lime) 
     { 
      button1.BackColor = Color.Lime; 
     } 
     else 
     { 
      button1.BackColor = Color.White; 
     } 
    } 

가 지금은 복사 버튼의 모든 것을 붙여 넣을 수 있지만, 나는 그것이 비효율적 알고; winforms를 사용하여 button2를 button1에 참조하면 button1의 색상이 변경됩니다 (분명히).

그래서 헬퍼 메서드, 새 클래스 또는 다른 것을 사용해야합니까? 그게 어떻게 생겼어?

+13

소품의 도움으로 버튼 이벤트 및 속성을 만들고이 링크를 참조하십시오. 당신은 이미 올바른 방법으로 생각하고 있습니다. –

답변

24

몇 가지 접근법이 있습니다.

private void button1_Click(object sender, EventArgs e) 
{ 
    ChangeColor(button1); 
} 

private void ChangeColor(Button button) 
{ 
    if (button.BackColor != Color.Lime) 
     button.BackColor = Color.Lime; 
    else 
     button.BackColor = Color.White; 
} 

그런 다음 각 버튼의 핸들러가 같은 함수 호출을 사용할 수 있습니다 : 하나는 다른 버튼이 부르는 공통 기능을 만들 수 있습니다.

또는이 모든 버튼은 항상 지금 똑같은 일이, 당신은 그들 모두를위한 하나 개의 클릭 핸들러 기능을 사용할 수 있습니다 않는됩니다. 이 경우 처리해야하는 버튼을 결정해야합니다 (현재 button1을 직접 참조하고있는 반면). 변경하려는 항목을 알고 있어야합니다. 핸들러 함수에 전달 된 sender 오브젝트는 실제로 핸들러를 호출 한 양식 요소에 대한 참조입니다.

private void button_Click(object sender, EventArgs e) 
{ 
    var button = (Button)sender; 
    if (button.BackColor != Color.Lime) 
     button.BackColor = Color.Lime; 
    else 
     button.BackColor = Color.White; 
} 

그래서 먼저 핸들러가 호출 한 버튼에 대한 참조를 가져온 다음 해당 버튼에 대한 논리를 실행합니다. 또한 좀 더 일반적인 핸들러 함수의 이름을 어떻게 만들 었는지 주목하십시오. 이제 폼 디자이너로 가서이 버튼을 호출해야하는 모든 버튼의 클릭 핸들러로 button_Click을 설정합니다.

+0

이것은 내가 찾고있는 것입니다. 도움, 설명 및 친절한 말을 해주셔서 감사합니다. – user2600871

+0

+1 좋은 답변; 매우 잘 설명되어 있습니다. –

5

이벤트를 제기 한 버튼은 번을 Button 번으로 전송할 수 있습니다.

그런 다음 모든 단추에 동일한 처리기를 추가 할 수 있습니다.

+2

여기에는 암시적인 "모든 버튼 이벤트를 처리하는 것과 동일한 메소드를 사용하십시오"라는 것이 있습니다. 컨트롤을 선택하여 Visual Studio에서 컨트롤의 이벤트 핸들러를 선택한 다음 속성 창에서 "이벤트"를 선택하고 "클릭"을 찾을 때까지 아래로 스크롤합니다. 그런 다음 "클릭"옆에있는 드롭 다운 상자에서 클릭 이벤트가 발생했을 때 호출 할 메소드를 선택할 수 있습니다. –

8

아마도 가장 쉬운 방법은 각 버튼에 동일한 클릭 핸들러를 호출하는 것입니다. 그런 다음 처리기 내부에서 Button1을 하드 코딩하는 대신 보낸 사람을 사용합니다.

private void buttons_Click(object sender, EventArgs e) 
    { 
     var theButton = (Button) sender; 
     if (theButton.BackColor != Color.Lime) 
     { 
      theButton.BackColor = Color.Lime; 
     } 
     else 
     { 
      theButton.BackColor = Color.White; 
     } 
    } 
13

정확한은 모든 C# 클래스에서와 같은 방식입니다. 자신의 클래스를 파생시키고 기본 클래스 비헤이비어를 사용자 정의합니다. 모든 이벤트에는 상응하는 OnXxxx() 메서드가 있습니다.

프로젝트에 새 클래스를 추가하고이 코드를 붙여 넣기 :

using System; 
using System.Windows.Forms; 

class MyButton : Button { 
    protected override void OnClick(EventArgs e) { 
     // Your code here 
     //... 
     base.OnClick(e); 
    } 
} 

변경의 OnClick의 코드() 당신이 원하는 일을 할 수 있습니다. 엮다. 이제 툴박스 상단에 자신의 버튼 컨트롤이 생깁니다. 양식에 원하는만큼 사본을 떨어 뜨릴 수 있습니다. 그들은 모두 코드를 양식에 추가하지 않고도 동일하게 작동합니다.

+0

일반적인 방법이나 공유 이벤트 처리기를 사용하는 것이 왜이 방법보다 우수하지 않습니다. 버튼이 정말 다른 형태로 사용될 흥미로운 것을한다면,이 방법은 정확하게가는 길입니다. 그렇지 않으면 잔인한 것처럼 보입니다. – siride

+1

+1 버튼 자체에 동작을 구축하는 것보다는 * Click 이벤트를 소비하지 않기 때문에 더 낫습니다. 이 솔루션은 이벤트 핸들러가 필요 없으며 코드가 속한 곳에서 정확하게 코드를 배치합니다. 그것이 잔인한 것인지 아닌지는 부적절합니다. 작성할 코드의 양은 본질적으로 동일하며 재사용 및 유지 보수가 가능한 솔루션입니다. 미래의 자아는 "이 버튼의 동작을 다시 코딩 한 부분은 어디입니까?"라고 묻지 않을 것입니다. 코드가 MyButton 클래스에 있기 때문입니다. 다른 솔루션으로 * 버튼을 다른 곳에서 재사용해야하는 경우 문제가 * 발생합니다. –

+0

@retailcoder : 아니요, 강도 제고 같은 것이 있습니다. 이거 야. Jeff Atwood의 오늘 블로그 (btw : http://www.codinghorror.com/blog/2013/07/rule-of-three.html)를 참조하십시오. 특히 분명히 사소한 프로그램을 위해 실제로 필요할 때까지 과장된 재사용으로 시간을 낭비하지 마십시오. – siride

0

저는 VB 녀석입니다 .... VB.Net에서는 여러 개의 이벤트 핸들러를 추가하고 여러 이벤트를 동일한 핸들러에 연결할 수 있습니다.

이 하위 단추는 모든 클릭을 색칠하기 위해 후크합니다.

Private Sub ColorButtons(sender As System.Object, e As System.EventArgs) _ 
Handles Button1.Click, Button2.Click, .. 

나는이에게 내가/드래그 새로운 하나를 만들기 위해 컨트롤을 복사하여 새 단추가 원래의 이벤트에 추가됩니다 실수 때문에 모든 시간을.

다른 하위 작업은 동일한 작업을 처리하여 다른 작업을 수행 할 수 있습니다. 둘 다 실행됩니다.

C#에서이를 수행하는 방법을 모릅니다.

+0

C#에서는 다르지 않습니다. –

0

이 작업을 수행하는 적절한 방법은 각 단추의 클릭 이벤트를 해당 용도로 코딩 한 함수에 연결하는 것입니다 (단추를 클릭 할 때 함수가 실행되기를 원하십니까?). 비슷한)을 코드의 해당 섹션에 추가하십시오.

MyButton1.Click += new RoutedEventHandler(buttons_Click); 
MyButton2.Click += new RoutedEventHandler(buttons_Click); 
etc... 

원하는만큼 많은 컨트롤을 이벤트 처리기에 연결할 수 있습니다. 이 코드는 단지를 Button1_Click에서 코드를 실행

private void button2_Click(object sender, EventArgs e) 
{ 
    button1.PerformClick(); 
} 

:

+0

'RoutedEventHandler' 부분은 중복되어 있습니다. 왜냐하면'Click' 이벤트가 이미 그것을 지정하기 때문에'MyButton1.Click + = buttons_Click; '으로 충분합니다. –

0

은 내가 일반적으로 이전 할 것은 이것이다.

그러나 실천하지 않으려 고 함으로서 데이비드가 제안한 것과 같은 기능/방법으로 간단히 말해보십시오.

관련 문제