2014-07-17 3 views
2

나는 지금 내가 며칠 동안 조사 해본 문제가있다. 나는 내가 원하는 것을 논리적으로 생각할 수 없다.동적으로 생성 된 컨트롤의 데이터 참조 및 저장?

나는 작업 목록이있는 앱을 가지고 있습니다. 텍스트 상자, datetimepicker 및 클릭시 이미지를 변경하는 PictureBox의 3 가지 컨트롤로 시작됩니다. 다음 아래 제어의 다른 행을 추가 할 이미지를 누르면 사용자는 (이미 생성 된 컨트롤에서 동적 제어의 속성을 취득)

https://www.dropbox.com/s/o2pub6orww24w25/tasklist.png

(이것은 그것이 명확하게하기위한 스크린 샷이다) 이제는 각 행 (TextBox, Date, Status로 정의 된 행)의 값을 SQLite DB에 저장합니다.

고유 한 디자인 이름이 있고 ('정적'컨트롤이기 때문에) 첫 번째 행은 쉽습니다. '는 현재 컨텍스트에 존재하지 않는'때문에

문제 a) I 동적 제어를 참조 할 수있다 : I 동적 제어의 값을 저장하려고하면 그러나, 문제는 안타. - 컨트롤을 만드는 함수는 공용 액세스 한정자가있어서 트릭을해야한다고 생각 했나요? - 그렇지 않았어. 나는 또한 시도했다 : Panel1.pb.blah하지만 그것은 여전히 ​​컨트롤을 인식하지 못했습니까?

문제 b) 각 행이 새로운 데이터 집합임을 내 프로그램에 알릴 수 있습니까? 즉, 각 행에 대해 새로운 삽입 명령을 실행하려면 어떻게해야합니까? - for each-textbox 루프로 생각했는데 매번 첫 번째 동적 날짜를 가져 오는 것이 아니라고 생각하십니까?

또한 태그 속성을 사용하여 카운터 변수를 설정하여 행의 컨트롤을 그룹화했습니다. (카운터는 새로운 행이 추가 될 때마다 증가하는 정수입니다.) 그러나 그림 상자는 해당 기능의 일부로 태그 속성을 사용하여 클릭 (변경 사항 여러 번) 할 때 이미지를 변경하기 때문에 그렇게 할 수 없습니다.

코드 :

추가 컨트롤 : 컨트롤을 참조하려고

public void pictureBox1_Click(object sender, EventArgs e) 
    { 
     //TextBox Control 
     int tbh = tasktb.Location.Y + (counter*25); 
     int tbsh = tasktb.Size.Height; 
     int tbsw = tasktb.Size.Width; 
     TextBox tb = new TextBox(); 
     tb.Location = new Point(9, tbh); 
     tb.Size = new System.Drawing.Size(tbsw, tbsh); 
     tb.Tag = counter.ToString(); 
     //Date Time Control 
     int dth = duedatedb.Location.Y + (counter * 25); 
     int dtsh = duedatedb.Size.Height; 
     int dtsw = duedatedb.Size.Width; 
     DateTimePicker dtp = new DateTimePicker(); 
     dtp.Location = new Point(300, dth); 
     dtp.Size = new Size(dtsw, dtsh); 
     dtp.Format = System.Windows.Forms.DateTimePickerFormat.Short; 
     //Picture Box Control 
     int stsh = status.Location.Y + (counter * 25); 
     int stssh = status.Size.Height; 
     int stssw = status.Size.Width; 
     PictureBox pb = new PictureBox(); 
     pb.Location = new Point(429, stsh); 
     pb.Size = new Size(stssw, stssh); 
     pb.Image = Red; 
     pb.Click += new System.EventHandler(pb_Click); 


     panel1.Controls.Add(tb); 
     panel1.Controls.Add(dtp); 
     panel1.Controls.Add(pb); 
     ++counter; 
    } 

: (클릭의 이미지를 변화의 목적은)는 MSDN이 연구에서 Control.Find 기능 발견 웹 사이트]

public void pb_Click(object sender, EventArgs e) 
    { 
     PictureBox pb = (panel1.Controls.Find("pb",false)); 
     if (pb.Image == Red) { pb.Image = Orange; status.Tag = "Orange"; } 
     else if (pb.Image == Orange) { pb.Image = green; status.Tag = "Green"; } 
     else if (pb.Image == green) { pb.Image = Red; status.Tag = "Red"; } 
    } 

근본적인 문제는 여기에 내가 그 잘못 갈 어디 사람이 볼 수있는 경우는, 난 도망 갈 수 및 일부 C를 작성하려고 할 것 문제입니다 문제를 해결하기위한 과업 b. (최선의 방법에 대한 제안으로이 문제 B를 포함 시켰습니다.) -

도움을 주셔서 감사합니다! 정말 고맙습니다!

답변

2

ControlCollection.Find은 지정된 이름의 컨트롤을 찾고 사용자가 설정하지 않았습니다. 코드의 변수 이름은 관련이 없습니다. 따라서, 다음 중 하나 :

pb.Name = "pb"; 

하지만 결국에는 동일한 이름의 여러 항목을 갖게됩니다.그래서, 당신은 클릭의 PictureBox의 그림을 변경하는 방법을보고, 그냥 이렇게 :

public void pb_Click(object sender, EventArgs e) 
{ 
    PictureBox pb = (PictureBox)sender; 
    if (pb.Image == Red) { pb.Image = Orange; status.Tag = "Orange"; } 
    else if (pb.Image == Orange) { pb.Image = green; status.Tag = "Green"; } 
    else if (pb.Image == green) { pb.Image = Red; status.Tag = "Red"; } 
} 

sender 인수는 항상 컨트롤을 클릭 한 쪽의 PictureBox이 경우, 이벤트를 발생 중에 대한 참조를 포함!

편집 : 다른 질문에 대해서는 나중에 컨트롤을 사용해야한다고 가정하므로 모든 항목 (또는 적어도 필요한 항목)에 대한 참조를 저장하는 것이 좋습니다. 이 :

// helper class 
private class Entry 
{ 
    public TextBox TextBox { get; private set; } 
    public DateTimePicker DateTimePicker { get; private set; } 
    public PictureBox PictureBox { get; private set; } 

    public Entry(TextBox tb, DateTimePicker dtp, PictureBox pb) 
    { 
     this.TextBox = tb; 
     this.DateTimePicker = dtp; 
     this.PictureBox = pb; 
    } 
} 

// member field 
private List<Entry> m_Entries = new List<Entry>(); 

// at the end of pictureBox1_Click 
public void pictureBox1_Click(object sender, EventArgs e) 
{ 
    .... 
    m_Entries.Add(new Entry(tb, dtp, pb)); 
} 

그런 다음 해당 목록의 항목을 사용하여 행과 상호 작용할 수 있습니다. 원래 데이터 구조가 무엇이든 인덱스 또는 참조를 추가 할 수도 있습니다. 또한 실제로 컨트롤을 직접 만들거나 실제로 일종의 테이블/그리드 컨트롤을 사용하여 호스트해야하는지 생각할 수도 있습니다.

로직을 포함하여 모두 UserControl의 모든 컨트롤을 마무리하십시오.

+0

훌륭합니다. 완벽하게 컴파일됩니다. 고마워요 – Wills

+0

@BlakeWills 당신은 남자 +1을주고 답을 받아 들여야합니다. 나는 정확하게 똑같은 것을 제안하려했다. –

+0

만약 내가 할 수 있었다면 (이 계정에 충분한 담당자가 없다면!) 대답을 받아 들일 것이다. – Wills

관련 문제