2014-01-06 81 views
0

我有一个下拉列表,它是gridview中列的列表。我需要能够根据第一个下拉列表中列的选择来填充另一个下拉列表。我填充第一个DropDownList这样的:在Linq查询中使用DropDownList selecteditem

public void ddlColumnPopulate() 
    { 
     var gvColumns = GridView1.Columns; 
     var viewName = ((IDataSource)EntityDataSource1).GetViewNames().OfType<string>().First(); 

     var view = (EntityDataSourceView)((IDataSource)EntityDataSource1).GetView(viewName); 
     var schema = view.GetViewSchema(); 
     var dsColumns = schema.Columns; 
     var dvColumnsDict = gvColumns.OfType<BoundField>().ToDictionary(a => a.DataField); 


     foreach (DataColumn c in dsColumns) 
     { 
      //var li = new ListItem(string.Format("{0}: {1}", c.ColumnName, c.DataType), c.DataType.ToString()); 
      var li = new ListItem(c.ColumnName, c.DataType.ToString()); 
      ddlColumn.Items.Add(li);     

     }    
    } 

我试图填充第二下拉列表这样的,但它不工作。我不确定你是否可以做这样的事情?

public void populatecolumn() 
    { 
     using (TestEntities dbContext = new TestEntities()) 
     { 

      string col = ddlColumn.SelectedItem.ToString(); 

      var a = (from b in dbContext.tbl_Batch       
         select col); 

      ddlData.DataSource = a; 
      ddlData.DataTextField = col; 
      ddlData.DataValueField = col; 
      DataBind(); 

      ddlData.Items.Insert(0, new ListItem(String.Empty, String.Empty)); 
      ddlData.SelectedIndex = 0; 

     }   
    } 

我收到错误消息:DataBinding:'System.String'不包含名为'intBatchID'的属性。

回答

0

更改 var a = (from b in dbContext.tbl_Batch
select col);

var a = (from b in dbContext.tbl_Batch
select col).tolist();

+0

我仍然收到相同的错误消息。 – hollyquinn

+0

哪条线提出你的错误?在DataBind中? –

+0

和a和col的内容是什么? –

0

您需要解决几件事情:

而不是SelectedItem.ToString(),你必须使用SelectedItem.Text

string col = ddlColumn.SelectedItem.Text; 

你需要修复linq查询为好。您将需要使用System.Linq.Dynamic 将列名称传递给linq查询。您还需要反射才能获取列数据。以下应工作,但我将不胜感激任何修改:

编辑:
您需要使用System.Linq.Dynamic,不Dynamic Expression API

string col = ddlColumn.SelectedItem.Text; 
string selColName = "new(" + col + ")"; 

var q = dbContext.tbl_Batch.Select(selColName); 

List<string> myList = new List<string>(); 

foreach (var colItem in q) 
{ 
    if (colItem != null) 
    { 

     Type type = colItem.GetType(); 
     PropertyInfo pInfo = type.GetProperty(col); 
     var myValue = pInfo.GetValue(colItem, null); 
     myList.Add(myValue.ToString()); 
    } 
} 
myList = myList.Select(x => x).Distinct().ToList(); 
ddlData.DataSource = myList; 
ddlData.DataBind(); 

您必须安装 Dynamic Expression API System.Linq.Dynamic(缴费在Nuget),并添加以下内容:

using System.Linq.Dynamic; 
using System.Reflection; 

可以downloadmy测试项目here

+0

我在linq上得到一个错误 - 不能转换lambda表达式键入'字符串',因为它不是一个委托类型。 – hollyquinn

+0

@hollyquinn - 我已经更新了我的答案。 – afzalulh

+0

当它到达foreach我收到错误消息:'新'不能被解析成有效的类型或功能。在简单的标识符附近,第1行,第8列。 – hollyquinn