2011-05-06 134 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 2011-05-06 14:27:36

回答

0

什麼技術你用你的用戶界面?如果你可以使用綁定,你不需要擔心匿名類型的反射,並且如果你需要從這裏進行格式化/計算,也可以使用轉換器。

從你的反應不能你只是使用連接到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語句包含一個函數,它可以從Pin獲取用戶名。以這種方式,組合框值成員是用戶引腳,顯示值是用戶的名稱。 – Brad 2011-05-06 15:00:39