2013-06-03 2 views
0

나는 usercontrol (usercontrol2)을 만들고 usercontrol (usercontrol2)에 textBox를 추가합니다.각 컨트롤의 텍스트 상자에 각 레코드 표시

양식 코드 : 내 테이블 (20 개) 기록을 포함하고 있기 때문에 위의 코드와

using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString)) 
     { 
      myDatabaseConnection.Open(); 
      using (SqlCommand SqlCommand = new SqlCommand("Select LastName from Employee", myDatabaseConnection)) 
      using (SqlDataAdapter da = new SqlDataAdapter(SqlCommand)) 
      { 

       SqlDataReader DR1 = SqlCommand.ExecuteReader(); 
       int y = 0; 
       while (DR1.Read()) 
       { 
        y++; 
        for (int i = 0; i < y; i++) 
        { 
         UserControl2 userconrol = new UserControl2(); 
         userconrol.Location = new Point(50, 30 * i); 
         userconrol.Tag = i; 
         this.Controls.Add(usercontrol); 
        } 
       } 
      } 
     } 

은 내 양식 20에 추가 된 UserControls를 표시합니다.

이제 각 usercontrols '텍스트 상자에 각 성을 표시하는 방법은 무엇입니까?

+0

데이터베이스에있는 성 필드의 이름은 무엇입니까? '(문자열) DR1 [ "LastName"]'예를 들어 .. usercontrol.text 필드 속성에 할당합니다. for 루프 내부에서 DR1을 캡처하지 않습니다. While 루프 내부에서 수행합니다. – MethodMan

+0

성 ... –

답변

3

여러 가지 방법이 있지만 가장 간단한 방법은 string 속성을 UserControl2에 만들고 해당 속성의 설정자에서 텍스트 상자를 업데이트하는 것입니다. 이런 식으로 뭔가 :

private string lastName; 
public string LastName 
{ 
    get { return lastName; } 
    set 
    { 
     lastName = value; 
     lastNameTextBox.Text = value; 
    } 
} 

그런 다음 위의 코드에서이 같은 일을 할 것 :

UserControl2 userconrol = new UserControl2(); 
userconrol.Location = new Point(50, 30 * i); 
userconrol.Tag = i; 
userconrol.LastName = (string)DR1["LastName"]; 
this.Controls.Add(usercontrol); 

(당신은 아마, 확인이 주조 주위에 어떤 에러 체크를하고 싶은거야있다 거기에 가치가 없으면 안된다.)

그러나 더 많은 필드가 추가됨에 따라 확장이 잘되지 않는다. 이 사용자 정의 컨트롤이 추가 된 곳이면이 코드를 반드시 업데이트해야합니다. 사용자 정의 컨트롤에 대한 뷰 모델을 작성하여 한 걸음 더 나아갈 수 있습니다. 그래서

public UserControl2(EmployeeViewModel model) 
{ 
    this.Location = model.Location; 
    this.Tag = model.Tag; 
    this.LastName = model.LastName; 
} 

언제든지 당신에게 :

public class EmployeeViewModel 
{ 
    public string LastName { get; set; } 
    public Point Location { get; set; } 
    public int Tag { get; set; } 
} 

당신은 생성자에 추가하여 사용자 정의 컨트롤에서이보기 모델을 필요로 할 수있다 :이 같은 것 우리가 지금까지 가지고있는 분야 감안할 때 UserControl2의 새 인스턴스를 만들 컴파일러의 힘은 당신이 그것을 필요로하는 데이터를 제공합니다 :

this.Controls.Add(
    new UserControl2(
     new EmployeeViewModel 
     { 
      LastName = (string)DR1["LastName"], 
      Location = new Point(50, 30 * i), 
      Tag = i 
     })); 

가 다시 말하지만,이 모든 다양한 방법 중 하나에 불과합니다. 아이디어는 논리적으로 사물을 사물로 그룹화하고 그 사물을 지나쳐 버리는 것입니다. 즉, 하나의 오브젝트를 설정하는 것이 많은 원시 값을 설정하는 것보다 선호됩니다. 이렇게하면 객체가 필요한 필드를 내부적으로 제어 할 수 있고, 필드에 응답하는 방법, 데이터의 유효성 검사 등을 수동으로 수행 할 필요없이 매번 수행 할 수 있습니다.

아마 여기에 접선이 있습니다. 첫 번째 예제에서와 같이 필요에 따라 값을 설정하는 방법을 사용자 정의 컨트롤에서 노출 한 다음 설정 만하면됩니다. 노출하는 방법은 당신에게 달려 있으며 객체가 논리적으로 캡슐화되는 방법입니다.

+0

멋진 예와 뛰어난 답변 'David' +1 – MethodMan

+0

감사합니다. :) 그것은 데이터베이스에서 이미지를로드하는 picturebox와 동일한 접근법입니까? –

+1

@ KarlxSwanovski : 솔직히 말해서 그림 상자 컨트롤 (또는 대부분의 WinForms 컨트롤)에 익숙하지 않습니다. 그림 상자에서 데이터의 바이트 배열을 예상하는 경우 노출 된 속성 또는 해당보기 모델 개체에 바이트 배열을 포함 할 수 있습니다. – David

관련 문제