2014-01-06 80 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