2014-02-27 3 views
0

내 첫 번째 양식 = 기본 및 내 2nd 양식 = ChampionSelect. 이걸로 메인에서 ChampSelect를 엽니 다.양식 작성 양식

private void pictureBox_championSelect_Click(object sender, EventArgs e) 
{ 
    ChampionSelect champSlct = new ChampionSelect(); 
    champSlct.Show(); 
} 

그리고 12 개의 아이콘이 그림 상자로 열립니다.

은 이제 사람이 내가 그것을 ChampionSelect에 클릭 한 아이콘의 이미지에 홈페이지pictureBox_championSelect의 이미지를 변경하려면

을 클릭 아이콘 무엇을 기반으로. 예를 들어

: 당신이 에서 에이스의 아이콘 ChampionSelect을 클릭하면 내가이 자료에 가져온 Ace.png에 홈페이지pictureBox_championSelect 이미지를 변경해야합니다.

그래서 나는 "메인은 '유형'하지만 변수처럼 사용할 것이다"와 작동하지 않습니다 말한다, 여기에 다른 게시물에서 배운이

public partial class ChampionSelect : Form 
{ 
    public ChampionSelect() 
    { 
     InitializeComponent(); 
     this.champSlct = Main; 
    } 

    Main champSlct; 


    public void icon_slctAce_Click(object sender, EventArgs e) 
    { 
     champSlct.pictureBox_championSelect.Image = Properties.Resources.Ace; 

    } 

을 시도했지만. 결국 나는 어떤 아이콘을 클릭했는지에 따라 다른 것들을 바꿀 것입니다. 그러나 이것과 비슷할 것이라고 가정하고 올바른 방향의 한 점이 더 도움이 될 것입니다. 이 같은

답변

3

:

public partial class ChampionSelect : Form { 
    public class ChampionSelectedEventArgs: EventArgs { 
     public Image ChampionImage { get; set; } 

     public ChampionSelectedEventArgs(Image championImage) { 
      this.ChampionImage = championImage; 
     } 
    } 

    public event EventHandler<ChampionSelectedEventArgs> ChampionSelected; 

    public ChampionSelect() { } 

    protected void onChampionSelected(Image im) { 
     if(this.ChampionSelected != null) 
      this.ChampionSelected(this, new ChampionSelectedEventArgs(im)); 
    } 

    public void icon_slctAce_Click(object sender, EventArgs e) { 
     onChampionSelected(Properties.Resources.Ace); 
    } 
} 

public partial class Main : Form { 
    private void pictureBox_championSelect_Click(object sender, EventArgs e) { 
     ChampionSelect champSlct = new ChampionSelect()); 
     champSlct.ChampionSelected += this.championSelected; 

     champSlct.Show(); 
    } 

    private void championSelected(object sender, ChampionSelectedEventArgs e) { 
     this.pictureBox_championSelect.Image = e.ChampionImage; 
    } 
} 

을 ChampionSelect에 전체 양식을 전달하면 구성 요소에게에 필요한 최소한의 정보를 제공해야하기 때문에 종류의 나쁜 관행이다 목표를 달성하십시오. 이 경우, ChampionSelect는 나중에 Mainframe의 pictureBox에 직접 액세스 할 필요가 없기 때문에 나중에 개발 과정에서 큰 두통을 유발할 수 있습니다 (더 이상 그림 상자를 원하지 않거나 더 복잡한 작업을 원한다면 어떻게 될지 고려하십시오).

+0

그건 나를 혼란스럽게합니다. – Marzdor

+0

@Marzdor Happens, 특히 처음에는 일어납니다.) 버튼과 그림 상자를 클릭하는 것과 같은 이벤트를 만들었습니다. 이벤트는 필요에 따라 호출되는 사용자 정의 함수 (이 경우 Main.championSelected)입니다 (이 경우 챔피언이 선택되었습니다) – BlackBear

0

뭔가 :

public partial class ChampionSelect : Form 
{ 
    Main champSlct; 

    public ChampionSelect(Main main) 
    { 
     InitializeComponent(); 
     this.champSlct = main; 
    } 

    public void icon_slctAce_Click(object sender, EventArgs e) 
    { 
     champSlct.ChampionSelect = Properties.Resources.Ace; 
    } 
} 

public partial class ChampionSelect : Form 
{ 
    public Image ChampionSelect 
    { 
     get { return pictureBox_championSelect.Image; } 
     set { pictureBox_championSelect.Image = value; } 
    } 

    private void pictureBox_championSelect_Click(object sender, EventArgs e) 
    { 
     using (var champSlct = new ChampionSelect(this)) 
     { 
      champSlct.Show(); 
     }  
    } 

    /* ... */ 
} 

다른 솔루션은 ChampionSelect 챔피언을 선택하면 공개 이벤트 whish 해고되어있을 수 있으며, 자신의 메인 폼이에 가입 할 수 있음을 수 있습니다. 이벤트 인수에서 이미지를 전달할 수 있습니다.

당신은 당신의 ChampionSelect 형태의 이벤트와 메인 이미지를 변경하는 처리기를 만들 수 있습니다