2011-05-06 137 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