2011-05-06 4 views
0

다음 코드를 사용하여 데이터베이스 테이블 tblDatabases에서 레코드를 가져옵니다. 그런 다음 값을 기준으로 양식에 컨트롤을 채 웁니다. 몇 가지 함수를 사용하여 텍스트 상자에 표시하는 데 필요한 값을 얻었습니다 (예 : 표시 값이 값과 다릅니다.)LINQ의 익명 형식

DetailData은 기본 형식 클래스의 개체입니다. 테이블없고 나는 내 양식의 컨트롤을 DetailDatatblDatabases 캐스팅 및 데이터에 대한 모든 값을 얻기 위해 반사를 사용하여 채울 수 있었다한다.

나는 더 이상 내 테이블에 DetailData 캐스팅 할 수 있어요 익명 형식 때문에

DetailData에 리플렉션을 사용하고 싶습니다. 값.

감사합니다, 브래드

DetailData = (from db in priorityDataContext.tblDatabases 
     where db.DatabaseID == Id 
     select new 
     { 
      db.DatabaseID, 
      db.DatabaseName, 
      db.Purpose, 
      db.BackEnd, 
      db.FrontEnd, 
      db.Version, 
      db.ProducesReports, 
      db.MultiUser, 
      db.UserDescription, 
      Developer = priorityDataContext.func_get_employee_name(db.Developer), 
      DeptOwner = priorityDataContext.func_get_dept_name(db.DeptOwner), 
      db.Source_Code_Path, 
      db.Notes, 
      db.Active, 
      db.row_entry_time_stamp, 
      row_oper_name = priorityDataContext.func_get_employee_name(db.Developer), 
      db.row_last_chng_time_stamp, 
      row_last_chng_oper_name = priorityDataContext.func_get_employee_name(db.Developer) 
     }).SingleOrDefault(); 


protected virtual void PopulateDetailControlsA(List<Control> controlContainers, string srcDataTableName) 
{ 
    switch (srcDataTableName) 
    { 
     case "tblDatabase" : 
      break; 
    } 

    var database = (tblDatabase) DetailData; 
    var type = typeof(tblDatabase); 
    var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    foreach (var controlContainer in controlContainers) 
    { 
     foreach (var propertyInfo in properties) 
     { 
      if (!ControlExists(controlContainer, propertyInfo.Name)) continue; 

      var txtExtControl = controlContainer.Controls[propertyInfo.Name] as ExtendedTextBox; 
      if (txtExtControl != null) 
      { 
       try 
       { 
        var value = propertyInfo.GetValue(database, null).ToString(); 

        txtExtControl.Text = value; 
       } 
       catch (NullReferenceException) 
       { 
       } 
       continue; 
      } 

      var lnklblControl = controlContainer.Controls[propertyInfo.Name] as ExtendedLinkLabel; 
      if (lnklblControl != null) 
      { 
       try 
       { 
        var value = propertyInfo.GetValue(database, null).ToString(); 

        lnklblControl.Text = value; 
       } 
       catch (NullReferenceException) 
       { 
       } 
       continue; 
      } 

      var chkControl = controlContainer.Controls[propertyInfo.Name] as ExtendedCheckBox; 
      if (chkControl != null) 
      { 
       try 
       { 
        var value = propertyInfo.GetValue(database, null).ToString(); 

        switch (value) 
        { 
         case "True": 
          chkControl.CheckState = CheckState.Checked; 
          break; 
         case "False": 
          chkControl.CheckState = CheckState.Unchecked; 
          break; 
        } 
       } 
       catch (NullReferenceException) 
       { 
        chkControl.CheckState = CheckState.Indeterminate; 
       } 
       continue; 
      } 

      var cmbControl = controlContainer.Controls[propertyInfo.Name] as ExtendedComboBox; 
      if (cmbControl != null) 
      { 
       try 
       { 
        var value = propertyInfo.GetValue(database, null).ToString(); 

        cmbControl.ValueMember = value; 
       } 
       catch (Exception ex) 
       { 
       } 
       continue; 
      } 
     } 
    } 
} 
+2

문제를 재현하는 데 필요한 최소한의 코드를 게시 할 수 있다면 도움이 될 수 있습니다. 지금 상황을 파악하는 것은 어렵습니다. – recursive

답변

0

당신은 당신의 UI에 어떤 기술을 사용하고 있습니까? 바인딩을 사용할 수있는 경우 익명 형식의 리플렉션에 대해 걱정할 필요가 없으며이 형식의 값을 형식화/계산해야하는 경우 변환기를 사용할 수도 있습니다.

답장을 보내 주시면 그냥 linq에 연결 한 다음 콤보 상자에 바인딩 할 수 없습니까?

private void Form1_Load(object sender, System.EventArgs e) 
    { 
     var item = new DataClassesDataContext(); 
     var stuff = item.Entity.Where(c => c.Property.Contains("something")); 
     comboBox1.DataSource = stuff; 
     comboBox1.DisplayMember = "Name"; 
     comboBox1.ValueMember = "PIN"; 
    } 
+0

기존 Winforms 응용 프로그램입니다. SQL 명령을 전환하고 linq를 사용하려고했습니다. 사용자 핀을 기반으로 연산자 이름과 같은 것을 표시합니다. 그래서 현재 SQL 문은 핀에서 사용자 이름을 가져 오는 함수를 포함합니다. 이 방식으로 콤보 상자 값 멤버는 사용자 핀이고 표시 값은 사용자 이름입니다. – Brad