2010-06-15 2 views
1

나는 다음 할당, 동적 몇 pictureboxes를 만드는 오전 : 각각의 다른 일련 번호를 그림 상자를 생성하고 기록하도록되어PaintEventHandler 논리적 문제

// class variable 
public String PaintLabel; 

// private void Form2_Load(object sender, EventArgs e) 

//begin loop 
this.PaintLabel = serialno; 
Shapes[i].Paint += new PaintEventHandler(ctl_Paint); 
// end loop 

// my event override 
private void ctl_Paint(object sender, PaintEventArgs e) 
{ 
    Control tmp = (Control)sender; 

    using (Font myFont = new Font("Arial", 9, FontStyle.Bold)) 
    { 
     e.Graphics.DrawString(this.PaintLabel, myFont, Brushes.LightYellow, new Point(62, 2)); 
    } // using (Font myFont = new Font("Arial", 10)) 
} // private void ctl_Paint(object sender, EventArgs e) 

. 그러나이 그림 상자

모두에있는 마지막 일련 번호를 기입 끝

편집 :

좋아, 솔루션 나를 위해 매우 고급입니다. 그러나 나는 그것을 이해하려고 노력했다.

나는 내 조각을 귀하의 코드에 추가했습니다. 내 루프에서

MyControl[] Shapes = new MyControl[Num_Picbox]; 

을 다음과 같이

그런 다음 내 그림 상자의 배열을 변경 나는 다음

Shapes[i].SerialNumber = serialno; 
Shapes[i].Paint += new PaintEventHandler(ctl_Paint); 

을했다하지만이 코드를 컴파일하고 실행하면 그것은에있는 일련 번호를 그릴 나던 picturebox.

해상도 :

감사합니다. 나는 페인트 이벤트가 지역 변수를 참조 couldnt는 그것을 분류

Dictionary<Control, string> PaintLabels = new Dictionary<Control, string>(); 

var PaintLabels = new Dictionary<Control, string>(); 

을 변경했습니다.

답변

1
루프가 완료 될 때까지 마지막 값 필드에있을 때 루프 내에서 당신은, 그 값을 업데이트해서 또 다시 문자열 필드를 사용하고 있기 때문에입니다

:

//begin loop 
// *** here is your problem; there is only one PaintLabel *** 
this.PaintLabel = serialno; 
Shapes[i].Paint += new PaintEventHandler(ctl_Paint); 
// end loop 

하나 해결책은 모양이있는만큼 많은 수의 요소로 배열로 PaintLabel을 만드는 것입니다. 또는 더 쉽게, 도형과 일련 번호 사이의 참조를 보유하는 Dictionary을 만드십시오.

var PaintLabels = new Dictionary<Control, string>(); 

//begin loop 
PaintLabels.Add(Shapes[i], serialno); 
Shapes[i].Paint += new PaintEventHandler(ctl_Paint); 
// end loop 


// in the paint event 
e.Graphics.DrawString(PaintLabel[tmp], myFont, Brushes.LightYellow, new Point(62, 2)); 
+0

감사합니다. 지금은 더 잘 이해합니다. 그림 상자에 그림을 그리려는 변수를 어떻게 할당합니까? 델리게이트 함수를 사용합니까? 이 문제를 해결하는 방법을 모르겠습니다. – Thomas

+0

각 그림 상자에 페인트 함수를 실행하고 각기 다른 일련 번호를 그릴 필요가 있기 때문에 직렬로 페인트 이벤트 처리기를 전달하고 현재 수행중인 문자열을 다시 사용하지 않아야합니다. – Thomas

+0

당신은 내 코드 샘플에서 대답을 가지고있다. 'PaintLabel'은 각'PictureBox' 컨트롤을 키로 사용하는 사전입니다. 페인트 이벤트 핸들러에서'tmp' 변수를 키로 사용하여 사전에서 해당 문자열을 가져올 수 있습니다 (내 대답의'DrawString' 샘플 참조). –

관련 문제