2011-03-09 6 views
5

안녕하세요, 저는 프레임 워크 4.0으로 업그레이드하고 데이터베이스에 관계 외래 키를 추가했습니다. 2 테이블 User and Staff에 가입하고 UI로 돌아가고 싶습니다. 직원 표에는 UserId가 있습니다. 즉, 사용자 이름을 datagridview에서 클릭 할 때마다 모든 텍스트 상자에 사용자 및 직원 데이터를 표시하고 싶습니다.튜플을 사용하여 linq 반환

나는

public IEnumerable<Tuple<User, Staff>> Get() 
    { 
     using (qDataContext db = new qDataContext()) 
     { 
      try 
      { 
       var r = from u in db.Users 
         join s in db.Staffs on u.Id equals s.UserId 
         select new Tuple<User, Staff>(u, s); 

       return r; 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 
    } 

그러나 UI의 튜플

은, 내가해야 할 방법이 바인딩을 사용합니까? gvUser.DataSource = user.Get();

참고로, gridview는 사용자 이름을 표시합니다. 직원 테이블 암호, datejoined 필드를 저장합니다 ..

그건 그렇고, 내가 이미 테이블에 외래 키 참조를 추가 한 이후로해야합니까 .. 나는 그것이 나를 돌아올만큼 똑똑해야한다고 생각하고 있습니다 User.Staff.Password


편집
이 난 내 데이터베이스에 .. 내가 추가 한 관계 외래 키를 찾을 것입니다. 아래의 코드는 이미 Staff.UserId으로 나에게 사용자 및 직원 데이터를 반환 할 수는 사용자 아이디 And i don have to use the TUPLE to return those object :)!!

public IEnumerable<User> Get() 
    { 
     using (ZebraDataContext db = new ZebraDataContext()) 
     { 
      try 
      { 
       var r = from u in db.Users 
         select u; 
         //join s in db.Staffs on u.Id equals s.UserId 
         //select new Tuple<User, Staff>(u, s); 

       return r.ToList(); 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 
    } 

내가 GUI의 DataGridView에 바인딩 때, 내가 문제가 지적된다.

private void InitializeData() 
    { 
     gvUser.DataSource = user.Get(); 
    } 

이 코드는 사용자 데이터를 보여줍니다. 하지만 gvUser_RowEnter을 수행하면 직원 데이터가 어떻게 되나요?

개인 무효 gvUser_RowEnter (객체 송신자 DataGridViewCellEventArgs E) { (e.RowIndex < = 0)에 복귀하는 경우;

 foreach (DataGridViewRow row in gvUser.SelectedRows) 
     { 
      User user = row.DataBoundItem as User; 
      txtName.Text = user.Name; 
      txtAddress.Text = user.Address; 
      txtPhone.Text = user.Phone; 
      txtPhone2.Text = user.Phone2; 
      txtRemark.Text = user.Remarks; 

      txtPassword.Text = user.Staffs.First().Password; 

     } 
    } 

txtPassword.text = user.Staffs.First().Password < ==는 삭제 된 개체에 액세스 할 수 없습니다이 오류 실패했습니다. 개체 이름 : 'Dispose.'후 액세스 한 DataContext.

내가 User에 Staff 객체를 추가 할 때. 나는 ((User) (row.DataBoundItem))의 데이터를 볼 수 있습니다. Staffs.entities.Items 직원 데이터가 있습니다 ..

답변

1

당신은 복합 형을 바인딩하고 싶다면 DescriptorProviders에 대해 생각해야합니다. 비슷한 예가 http://www.ureader.com/msg/14411105.aspx입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 제 3 자 libarry를 사용하지 않는 것이 좋습니다. – VeecoTech

3

Tuple을 반환하는 대신 익명 객체를 반환하지 않는 것이 트릭입니까? 다음과 같이 보일 수 있습니다.

var r = from u in db.Users 
    select new { u.Name, 
       u.Address, 
       ..., 
       (from s in db.Staffs select s.Password where u.Id == s.UserId) 
       }; 
관련 문제