在Linq Query中使用DropDownList selecteditem

时间:2014-01-06 16:30:48

标签: c# asp.net linq drop-down-menu

我有一个下拉列表,它是gridview中列的列表。我需要能够根据第一个下拉列表中列的选择来填充另一个下拉列表。我正在填充第一个下拉列表,如下所示:

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'的属性。

2 个答案:

答案 0 :(得分:0)

改变你的 var a = (from b in dbContext.tbl_Batch
select col);

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

答案 1 :(得分: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;

您可以下载我的测试项目here